From 0442eab1f852091d7fa29c27c2843903e89e298a Mon Sep 17 00:00:00 2001 From: Trey t Date: Thu, 26 Feb 2026 11:47:16 -0600 Subject: [PATCH] Rebrand entire project from Feels to Reflect Complete rename across all bundle IDs, App Groups, CloudKit containers, StoreKit product IDs, data store filenames, URL schemes, logger subsystems, Swift identifiers, user-facing strings (7 languages), file names, directory names, Xcode project, schemes, assets, and documentation. Co-Authored-By: Claude Opus 4.6 --- .gitignore | 2 +- AGENTS.md | 2 +- CLAUDE.md | 43 ++- Configuration.storekit | 6 +- .../xcschemes/xcschememanagement.plist | 194 ----------- FeelsWidget2/WidgetBundle.swift | 21 -- PROJECT_OVERVIEW.md | 28 +- ...entitlements => Reflect (iOS).entitlements | 4 +- ...itlements => Reflect (iOS)Dev.entitlements | 4 +- .../AppIcon.appiconset/AppIcon.png | Bin .../AppIcon.appiconset/Contents.json | 0 .../Assets.xcassets/Contents.json | 0 .../ContentView.swift | 2 +- .../Reflect Watch App.entitlements | 4 +- .../Reflect Watch AppDebug.entitlements | 4 +- .../ReflectComplication.swift | 54 +-- .../ReflectWatchApp.swift | 6 +- ...OS--Info.plist => Reflect--iOS--Info.plist | 6 +- .../project.pbxproj | 308 ++++++++---------- .../contents.xcworkspacedata | 0 .../xcshareddata/IDEWorkspaceChecks.plist | 0 .../xcshareddata/WorkspaceSettings.xcsettings | 0 .../xcshareddata/swiftpm/Package.resolved | 0 .../xcschemes/Reflect (iOS).xcscheme | 26 +- .../xcschemes/ReflectWidgetExtension.xcscheme | 32 +- {Feels => Reflect}/Localizable.xcstrings | 188 +++++------ .../DataControllerCRUDTests.swift | 4 +- .../DayViewViewModelTests.swift | 4 +- .../IntegrationTests.swift | 4 +- .../StreakTests.swift | 4 +- .../VoteLogicsTests.swift | 4 +- .../DebugInfo.plist | 2 +- .../AccentColor.colorset/Contents.json | 0 .../AppIcon.appiconset/Contents.json | 4 +- .../AppIcon.appiconset/ReflectAppIcon 1.png | Bin .../AppIcon.appiconset/ReflectAppIcon.png | Bin .../Assets.xcassets/Contents.json | 0 .../WidgetBackground.colorset/Contents.json | 0 .../Assets.xcassets/custom_icon/Contents.json | 0 .../android-brands.imageset/Contents.json | 0 .../android-brands.png | Bin .../apple-brands.imageset/Contents.json | 0 .../apple-brands.imageset/apple-brands.png | Bin .../arrow-up-solid.imageset/Contents.json | 0 .../arrow-up-solid.png | Bin .../baby-solid.imageset/Contents.json | 0 .../baby-solid.imageset/baby-solid.png | Bin .../ban-solid.imageset/Contents.json | 0 .../ban-solid.imageset/ban-solid.png | Bin .../baseball-solid.imageset/Contents.json | 0 .../baseball-solid.png | Bin .../Contents.json | 0 .../battery-empty-solid.png | Bin .../battery-full-solid.imageset/Contents.json | 0 .../battery-full-solid.png | Bin .../battery-half-solid.imageset/Contents.json | 0 .../battery-half-solid.png | Bin .../Contents.json | 0 .../battery-quarter-solid.png | Bin .../Contents.json | 0 .../battery-three-quarters-solid.png | Bin .../bitcoin-brands.imageset/Contents.json | 0 .../bitcoin-brands.png | Bin .../Contents.json | 0 .../bolt-lightning-solid.png | Bin .../bolt-solid.imageset/Contents.json | 0 .../bolt-solid.imageset/bolt-solid.png | Bin .../bomb-solid.imageset/Contents.json | 0 .../bomb-solid.imageset/bomb-solid.png | Bin .../btc-brands.imageset/Contents.json | 0 .../btc-brands.imageset/btc-brands.png | Bin .../bullhorn-solid.imageset/Contents.json | 0 .../bullhorn-solid.png | Bin .../bullseye-solid.imageset/Contents.json | 0 .../bullseye-solid.png | Bin .../burger-solid.imageset/Contents.json | 0 .../burger-solid.imageset/burger-solid.png | Bin .../cannabis-solid.imageset/Contents.json | 0 .../cannabis-solid.png | Bin .../caret-down-solid.imageset/Contents.json | 0 .../caret-down-solid.png | Bin .../caret-left-solid.imageset/Contents.json | 0 .../caret-left-solid.png | Bin .../caret-right-solid.imageset/Contents.json | 0 .../caret-right-solid.png | Bin .../caret-up-solid.imageset/Contents.json | 0 .../caret-up-solid.png | Bin .../chess-king-solid.imageset/Contents.json | 0 .../chess-king-solid.png | Bin .../chess-queen-solid.imageset/Contents.json | 0 .../chess-queen-solid.png | Bin .../circle-xmark-solid.imageset/Contents.json | 0 .../circle-xmark-solid.png | Bin .../clock-solid.imageset/Contents.json | 0 .../clock-solid.imageset/clock-solid.png | Bin .../code-compare-solid.imageset/Contents.json | 0 .../code-compare-solid.png | Bin .../code-solid.imageset/Contents.json | 0 .../code-solid.imageset/code-solid.png | Bin .../cross-solid.imageset/Contents.json | 0 .../cross-solid.imageset/cross-solid.png | Bin .../crosshairs-solid.imageset/Contents.json | 0 .../crosshairs-solid.png | Bin .../crown-solid.imageset/Contents.json | 0 .../crown-solid.imageset/crown-solid.png | Bin .../dharmachakra-solid.imageset/Contents.json | 0 .../dharmachakra-solid.png | Bin .../dice-d20-solid.imageset/Contents.json | 0 .../dice-d20-solid.png | Bin .../dice-one-solid.imageset/Contents.json | 0 .../dice-one-solid.png | Bin .../divide-solid.imageset/Contents.json | 0 .../divide-solid.imageset/divide-solid.png | Bin .../dollar-sign-solid.imageset/Contents.json | 0 .../dollar-sign-solid.png | Bin .../dragon-solid.imageset/Contents.json | 0 .../dragon-solid.imageset/dragon-solid.png | Bin .../egg-solid.imageset/Contents.json | 0 .../egg-solid.imageset/egg-solid.png | Bin .../empire-brands.imageset/Contents.json | 0 .../empire-brands.imageset/empire-brands.png | Bin .../exclamation-solid.imageset/Contents.json | 0 .../exclamation-solid.png | Bin .../eye-solid.imageset/Contents.json | 0 .../eye-solid.imageset/eye-solid.png | Bin .../fan-solid.imageset/Contents.json | 0 .../fan-solid.imageset/fan-solid.png | Bin .../fire-solid.imageset/Contents.json | 0 .../fire-solid.imageset/fire-solid.png | Bin .../floppy-disk-solid.imageset/Contents.json | 0 .../floppy-disk-solid.png | Bin .../fly-brands.imageset/Contents.json | 0 .../fly-brands.imageset/fly-brands.png | Bin .../Contents.json | 0 .../fort-awesome-brands.png | Bin .../frown-regular.imageset/Contents.json | 0 .../frown-regular.imageset/frown-regular.png | Bin .../futbol-solid.imageset/Contents.json | 0 .../futbol-solid.imageset/futbol-solid.png | Bin .../gem-solid.imageset/Contents.json | 0 .../gem-solid.imageset/gem-solid.png | Bin .../grin-regular.imageset/Contents.json | 0 .../grin-regular.imageset/grin-regular.png | Bin .../heart-crack-solid.imageset/Contents.json | 0 .../heart-crack-solid.png | Bin .../heart-solid.imageset/Contents.json | 0 .../heart-solid.imageset/heart-solid.png | Bin .../hotjar-brands.imageset/Contents.json | 0 .../hotjar-brands.imageset/hotjar-brands.png | Bin .../jet-fighter-solid.imageset/Contents.json | 0 .../jet-fighter-solid.png | Bin .../lemon-solid.imageset/Contents.json | 0 .../lemon-solid.imageset/lemon-solid.png | Bin .../life-ring-solid.imageset/Contents.json | 0 .../life-ring-solid.png | Bin .../lightbulb-solid.imageset/Contents.json | 0 .../lightbulb-solid.png | Bin .../Contents.json | 0 .../location-crosshairs-solid.png | Bin .../meh-regular.imageset/Contents.json | 0 .../meh-regular.imageset/meh-regular.png | Bin .../meteor-solid.imageset/Contents.json | 0 .../meteor-solid.imageset/meteor-solid.png | Bin .../microphone-solid.imageset/Contents.json | 0 .../microphone-solid.png | Bin .../moon-solid.imageset/Contents.json | 0 .../moon-solid.imageset/moon-solid.png | Bin .../peace-solid.imageset/Contents.json | 0 .../peace-solid.imageset/peace-solid.png | Bin .../pizza-slice-solid.imageset/Contents.json | 0 .../pizza-slice-solid.png | Bin .../poo-solid.imageset/Contents.json | 0 .../poo-solid.imageset/poo-solid.png | Bin .../poo-storm-solid.imageset/Contents.json | 0 .../poo-storm-solid.png | Bin .../rainbow-solid.imageset/Contents.json | 0 .../rainbow-solid.imageset/rainbow-solid.png | Bin .../sad-tear-regular.imageset/Contents.json | 0 .../sad-tear-regular.png | Bin .../Contents.json | 0 .../shuttle-space-solid.png | Bin .../Contents.json | 0 .../skull-crossbones-solid.png | Bin .../skull-solid.imageset/Contents.json | 0 .../skull-solid.imageset/skull-solid.png | Bin .../smile-beam-regular.imageset/Contents.json | 0 .../smile-beam-regular.png | Bin .../star-solid.imageset/Contents.json | 0 .../star-solid.imageset/star-solid.png | Bin .../virus-covid-solid.imageset/Contents.json | 0 .../virus-covid-solid.png | Bin .../default_image/Contents.json | 0 .../average.imageset/Contents.json | 0 .../average.imageset/meh-regular.png | Bin .../default_image/bad.imageset/Contents.json | 0 .../bad.imageset/frown-regular.png | Bin .../default_image/good.imageset/Contents.json | 0 .../good.imageset/grin-regular.png | Bin .../great.imageset/Contents.json | 0 .../great.imageset/smile-beam-regular.png | Bin .../horrible.imageset/Contents.json | 0 .../horrible.imageset/sad-tear-regular.png | Bin .../missing.imageset/Contents.json | 0 .../missing.imageset/xmark-solid.png | Bin .../xmark-solid.imageset/Contents.json | 0 .../xmark-solid.imageset/xmark-solid.png | Bin .../ReflectGraphicWidget.swift | 14 +- .../ReflectIconWidget.swift | 16 +- .../ReflectLiveActivity.swift | 4 +- .../ReflectMoodControlWidget.swift | 18 +- .../ReflectTimelineWidget.swift | 40 +-- .../ReflectVoteWidget.swift | 42 +-- .../ReflectWidget.intentdefinition | 0 ReflectWidget/WidgetBundle.swift | 21 ++ .../WidgetDataProvider.swift | 2 +- .../WidgetModels.swift | 2 +- .../WidgetProviders.swift | 2 +- .../WidgetSharedViews.swift | 10 +- ...plist => ReflectWidgetExtension-Info.plist | 0 ...nts => ReflectWidgetExtension.entitlements | 4 +- ... => ReflectWidgetExtensionDev.entitlements | 4 +- Shared/AccessibilityIdentifiers.swift | 2 +- Shared/Analytics.swift | 2 +- Shared/AppDelegate.swift | 2 +- Shared/AppShortcuts.swift | 8 +- .../AppIcon.appiconset/Contents.json | 4 +- ...eelsAppIcon 1.png => ReflectAppIcon 1.png} | Bin .../{FeelsAppIcon.png => ReflectAppIcon.png} | Bin .../Contents.json | 2 +- .../ReflectAppIcon.png} | Bin Shared/BGTask.swift | 4 +- Shared/Date+Extensions.swift | 2 +- Shared/DemoAnimationManager.swift | 2 +- Shared/GoogleService-Info.plist | 4 +- Shared/HealthKitManager.swift | 10 +- Shared/IAPManager.swift | 6 +- Shared/LocalNotification.swift | 2 +- Shared/Models/AIInsight.swift | 2 +- Shared/Models/AppTheme.swift | 2 +- .../Models/CustomWidgetStateViewModel.swift | 2 +- Shared/Models/DaysFilterClass.swift | 2 +- Shared/Models/DiamondView.swift | 2 +- Shared/Models/Mood.swift | 2 +- Shared/Models/MoodEntryModel.swift | 2 +- Shared/Models/MoodImagable.swift | 2 +- Shared/Models/MoodMetrics.swift | 2 +- Shared/Models/MoodTintable.swift | 2 +- Shared/Models/OnboardingDataDataManager.swift | 2 +- Shared/Models/PersonalityPackable.swift | 2 +- Shared/Models/Shapes.swift | 2 +- Shared/Models/SharingImageModels.swift | 2 +- Shared/Models/Theme.swift | 2 +- Shared/Models/UserDefaultsStore.swift | 2 +- Shared/MoodEntryFunctions.swift | 2 +- Shared/MoodLogger.swift | 8 +- Shared/MoodStreakActivity.swift | 2 +- Shared/Onboarding/OnboardingData.swift | 2 +- .../views/OnboardingCustomizeOne.swift | 2 +- .../views/OnboardingCustomizeTwo.swift | 2 +- Shared/Onboarding/views/OnboardingDay.swift | 2 +- Shared/Onboarding/views/OnboardingMain.swift | 2 +- Shared/Onboarding/views/OnboardingStyle.swift | 2 +- .../views/OnboardingSubscription.swift | 4 +- Shared/Onboarding/views/OnboardingTime.swift | 2 +- Shared/Onboarding/views/OnboardingTitle.swift | 2 +- .../Onboarding/views/OnboardingWelcome.swift | 4 +- .../Onboarding/views/OnboardingWrapup.swift | 2 +- Shared/Persisence/DataController.swift | 4 +- Shared/Persisence/DataControllerADD.swift | 4 +- Shared/Persisence/DataControllerDELETE.swift | 2 +- Shared/Persisence/DataControllerGET.swift | 4 +- Shared/Persisence/DataControllerHelper.swift | 2 +- .../Persisence/DataControllerProtocol.swift | 2 +- Shared/Persisence/DataControllerUPDATE.swift | 2 +- Shared/Persisence/ExtensionDataProvider.swift | 14 +- Shared/Persisence/SharedModelContainer.swift | 12 +- Shared/Protocols/ChartDataBuildable.swift | 2 +- Shared/Protocols/ChartViewItemBuildable.swift | 2 +- Shared/Protocols/SharingTemplate.swift | 2 +- Shared/Random.swift | 6 +- Shared/{FeelsApp.swift => ReflectApp.swift} | 10 +- Shared/{FeelsTips.swift => ReflectTips.swift} | 86 ++--- Shared/Services/AppLogger.swift | 4 +- Shared/Services/BiometricAuthManager.swift | 6 +- Shared/Services/ExportService.swift | 10 +- Shared/Services/ExportableInsightsViews.swift | 2 +- Shared/Services/ExportableWatchViews.swift | 4 +- Shared/Services/ExportableWidgetViews.swift | 10 +- .../FoundationModelsInsightService.swift | 4 +- Shared/Services/HealthService.swift | 2 +- Shared/Services/ImageCache.swift | 4 +- Shared/Services/InsightsExporter.swift | 2 +- Shared/Services/MoodDataSummarizer.swift | 2 +- Shared/Services/PhotoManager.swift | 2 +- Shared/Services/ReviewRequestManager.swift | 10 +- .../Services/SharingScreenshotExporter.swift | 2 +- .../Services/WatchConnectivityManager.swift | 4 +- Shared/Services/WatchExporter.swift | 2 +- Shared/Services/WidgetExporter.swift | 2 +- Shared/SharedMoodIntent.swift | 10 +- Shared/ShowBasedOnVoteLogics.swift | 2 +- Shared/Stats.swift | 2 +- Shared/UITestMode.swift | 4 +- Shared/Utilities/AccessibilityHelpers.swift | 2 +- Shared/View+Extensions.swift | 2 +- Shared/Views/AddMoodHeaderView.swift | 2 +- Shared/Views/BGView.swift | 2 +- Shared/Views/CelebrationAnimations.swift | 2 +- .../Views/CustomIcon/CreateWidgetView.swift | 2 +- Shared/Views/CustomIcon/IconView.swift | 2 +- Shared/Views/CustomIcon/IconViewModel.swift | 2 +- .../CustomWidget/CustomWidgetModel.swift | 2 +- .../Views/CustomWidget/CustomWidgetView.swift | 2 +- .../Views/CustomizeView/CustomizeView.swift | 4 +- .../SubViews/AppThemePickerView.swift | 2 +- .../SubViews/CustomWigetView.swift | 2 +- .../SubViews/DayFilterPickerView.swift | 2 +- .../SubViews/IconPickerView.swift | 2 +- .../SubViews/ImagePackPickerView.swift | 2 +- .../SubViews/PersonalityPackPickerView.swift | 2 +- .../SubViews/ShapePickerView.swift | 2 +- .../SubViews/ThemePickerView.swift | 2 +- .../SubViews/VotingLayoutPickerView.swift | 2 +- Shared/Views/DayChartView.swift | 2 +- Shared/Views/DayView/DayViewViewModel.swift | 2 +- Shared/Views/EmptyView.swift | 2 +- Shared/Views/EntryListView.swift | 2 +- Shared/Views/ExportView.swift | 4 +- Shared/Views/HeaderPercView.swift | 2 +- Shared/Views/HeaderStatsView.swift | 2 +- Shared/Views/IAPWarningView.swift | 4 +- Shared/Views/ImagePickerGridView.swift | 2 +- Shared/Views/InsightsView/InsightsView.swift | 4 +- .../InsightsView/InsightsViewModel.swift | 2 +- Shared/Views/LockScreenView.swift | 2 +- Shared/Views/MainTabView.swift | 2 +- Shared/Views/MonthView/MonthDetailView.swift | 2 +- Shared/Views/MonthView/MonthView.swift | 4 +- Shared/Views/NoteEditorView.swift | 2 +- Shared/Views/PhotoPickerView.swift | 2 +- Shared/Views/PurchaseButtonView.swift | 4 +- ...ift => ReflectSubscriptionStoreView.swift} | 18 +- Shared/Views/SampleEntryView.swift | 2 +- .../DebugAnimationSettingsView.swift | 2 +- .../LiveActivityPreviewView.swift | 2 +- .../PaywallPreviewSettingsView.swift | 4 +- .../Views/SettingsView/SettingsTabView.swift | 4 +- Shared/Views/SettingsView/SettingsView.swift | 12 +- Shared/Views/Sharing/SharingListView.swift | 2 +- .../Sharing/SharingStylePickerView.swift | 2 +- .../AllMoodsTotalTemplate.swift | 2 +- .../CurrentStreakTemplate.swift | 2 +- .../LongestStreakTemplate.swift | 2 +- .../SharingTemplates/MonthTotalTemplate.swift | 2 +- .../Variations/AllMoodsVariations.swift | 10 +- .../Variations/CurrentStreakVariations.swift | 10 +- .../Variations/LongestStreakVariations.swift | 10 +- .../Variations/MonthTotalVariations.swift | 10 +- .../SharingTemplates/WeekTotalTemplate.swift | 2 +- Shared/Views/SmallRollUpHeaderView.swift | 2 +- Shared/Views/SwitchableView.swift | 2 +- Shared/Views/TipModalView.swift | 34 +- Shared/Views/YearView/YearView.swift | 4 +- Shared/Views/YearView/YearViewModel.swift | 2 +- Tests iOS/DeepLinkTests.swift | 10 +- Tests iOS/PremiumCustomizationTests.swift | 2 +- Tests iOS/Tests_iOS.swift | 2 +- docs/ASO-Keywords.md | 6 +- docs/ASO-Metadata.md | 42 +-- docs/ASO-Strategy.md | 12 +- docs/ASO-Visual-Assets.md | 10 +- docs/AppStoreScreens.pxd | Bin 18563676 -> 18581278 bytes docs/Apple-Features.md | 64 ++-- docs/Competitive-Analysis.md | 2 +- ...st_Plan.xlsx => Reflect_QA_Test_Plan.xlsx} | Bin docs/TipKit-Tips.md | 36 +- docs/XCUITest-Authoring.md | 8 +- .../_App-Store-Optimization-Complete-Guide.md | 2 +- docs/competitors/README.md | 2 +- uiTestPrompt.md | 4 +- 380 files changed, 858 insertions(+), 1077 deletions(-) delete mode 100644 Feels.xcodeproj/xcuserdata/treyt.xcuserdatad/xcschemes/xcschememanagement.plist delete mode 100644 FeelsWidget2/WidgetBundle.swift rename Feels (iOS).entitlements => Reflect (iOS).entitlements (87%) rename Feels (iOS)Dev.entitlements => Reflect (iOS)Dev.entitlements (84%) rename {Feels Watch App => Reflect Watch App}/Assets.xcassets/AppIcon.appiconset/AppIcon.png (100%) rename {Feels Watch App => Reflect Watch App}/Assets.xcassets/AppIcon.appiconset/Contents.json (100%) rename {Feels Watch App => Reflect Watch App}/Assets.xcassets/Contents.json (100%) rename {Feels Watch App => Reflect Watch App}/ContentView.swift (99%) rename FeelsWidgetExtension.entitlements => Reflect Watch App/Reflect Watch App.entitlements (83%) rename FeelsWidgetExtensionDev.entitlements => Reflect Watch App/Reflect Watch AppDebug.entitlements (82%) rename Feels Watch App/FeelsComplication.swift => Reflect Watch App/ReflectComplication.swift (80%) rename Feels Watch App/FeelsWatchApp.swift => Reflect Watch App/ReflectWatchApp.swift (80%) rename Feels--iOS--Info.plist => Reflect--iOS--Info.plist (81%) rename {Feels.xcodeproj => Reflect.xcodeproj}/project.pbxproj (86%) rename {Feels.xcodeproj => Reflect.xcodeproj}/project.xcworkspace/contents.xcworkspacedata (100%) rename {Feels.xcodeproj => Reflect.xcodeproj}/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist (100%) rename {Feels.xcodeproj => Reflect.xcodeproj}/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings (100%) rename {Feels.xcodeproj => Reflect.xcodeproj}/project.xcworkspace/xcshareddata/swiftpm/Package.resolved (100%) rename Feels.xcodeproj/xcshareddata/xcschemes/Feels (iOS).xcscheme => Reflect.xcodeproj/xcshareddata/xcschemes/Reflect (iOS).xcscheme (81%) rename Feels.xcodeproj/xcshareddata/xcschemes/FeelsWidgetExtension.xcscheme => Reflect.xcodeproj/xcshareddata/xcschemes/ReflectWidgetExtension.xcscheme (81%) rename {Feels => Reflect}/Localizable.xcstrings (98%) rename {FeelsTests => ReflectTests}/DataControllerCRUDTests.swift (99%) rename {FeelsTests => ReflectTests}/DayViewViewModelTests.swift (97%) rename {FeelsTests => ReflectTests}/IntegrationTests.swift (99%) rename {FeelsTests => ReflectTests}/StreakTests.swift (99%) rename {FeelsTests => ReflectTests}/VoteLogicsTests.swift (99%) rename {FeelsWatch WatchKit Extension => ReflectWatch WatchKit Extension}/DebugInfo.plist (87%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/AccentColor.colorset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/AppIcon.appiconset/Contents.json (87%) rename FeelsWidget2/Assets.xcassets/AppIcon.appiconset/FeelsAppIcon 1.png => ReflectWidget/Assets.xcassets/AppIcon.appiconset/ReflectAppIcon 1.png (100%) rename FeelsWidget2/Assets.xcassets/AppIcon.appiconset/FeelsAppIcon.png => ReflectWidget/Assets.xcassets/AppIcon.appiconset/ReflectAppIcon.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/WidgetBackground.colorset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/android-brands.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/android-brands.imageset/android-brands.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/apple-brands.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/apple-brands.imageset/apple-brands.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/arrow-up-solid.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/arrow-up-solid.imageset/arrow-up-solid.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/baby-solid.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/baby-solid.imageset/baby-solid.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/ban-solid.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/ban-solid.imageset/ban-solid.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/baseball-solid.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/baseball-solid.imageset/baseball-solid.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/battery-empty-solid.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/battery-empty-solid.imageset/battery-empty-solid.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/battery-full-solid.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/battery-full-solid.imageset/battery-full-solid.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/battery-half-solid.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/battery-half-solid.imageset/battery-half-solid.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/battery-quarter-solid.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/battery-quarter-solid.imageset/battery-quarter-solid.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/battery-three-quarters-solid.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/battery-three-quarters-solid.imageset/battery-three-quarters-solid.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/bitcoin-brands.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/bitcoin-brands.imageset/bitcoin-brands.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/bolt-lightning-solid.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/bolt-lightning-solid.imageset/bolt-lightning-solid.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/bolt-solid.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/bolt-solid.imageset/bolt-solid.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/bomb-solid.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/bomb-solid.imageset/bomb-solid.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/btc-brands.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/btc-brands.imageset/btc-brands.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/bullhorn-solid.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/bullhorn-solid.imageset/bullhorn-solid.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/bullseye-solid.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/bullseye-solid.imageset/bullseye-solid.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/burger-solid.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/burger-solid.imageset/burger-solid.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/cannabis-solid.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/cannabis-solid.imageset/cannabis-solid.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/caret-down-solid.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/caret-down-solid.imageset/caret-down-solid.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/caret-left-solid.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/caret-left-solid.imageset/caret-left-solid.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/caret-right-solid.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/caret-right-solid.imageset/caret-right-solid.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/caret-up-solid.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/caret-up-solid.imageset/caret-up-solid.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/chess-king-solid.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/chess-king-solid.imageset/chess-king-solid.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/chess-queen-solid.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/chess-queen-solid.imageset/chess-queen-solid.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/circle-xmark-solid.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/circle-xmark-solid.imageset/circle-xmark-solid.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/clock-solid.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/clock-solid.imageset/clock-solid.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/code-compare-solid.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/code-compare-solid.imageset/code-compare-solid.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/code-solid.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/code-solid.imageset/code-solid.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/cross-solid.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/cross-solid.imageset/cross-solid.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/crosshairs-solid.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/crosshairs-solid.imageset/crosshairs-solid.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/crown-solid.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/crown-solid.imageset/crown-solid.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/dharmachakra-solid.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/dharmachakra-solid.imageset/dharmachakra-solid.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/dice-d20-solid.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/dice-d20-solid.imageset/dice-d20-solid.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/dice-one-solid.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/dice-one-solid.imageset/dice-one-solid.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/divide-solid.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/divide-solid.imageset/divide-solid.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/dollar-sign-solid.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/dollar-sign-solid.imageset/dollar-sign-solid.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/dragon-solid.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/dragon-solid.imageset/dragon-solid.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/egg-solid.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/egg-solid.imageset/egg-solid.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/empire-brands.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/empire-brands.imageset/empire-brands.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/exclamation-solid.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/exclamation-solid.imageset/exclamation-solid.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/eye-solid.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/eye-solid.imageset/eye-solid.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/fan-solid.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/fan-solid.imageset/fan-solid.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/fire-solid.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/fire-solid.imageset/fire-solid.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/floppy-disk-solid.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/floppy-disk-solid.imageset/floppy-disk-solid.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/fly-brands.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/fly-brands.imageset/fly-brands.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/fort-awesome-brands.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/fort-awesome-brands.imageset/fort-awesome-brands.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/frown-regular.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/frown-regular.imageset/frown-regular.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/futbol-solid.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/futbol-solid.imageset/futbol-solid.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/gem-solid.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/gem-solid.imageset/gem-solid.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/grin-regular.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/grin-regular.imageset/grin-regular.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/heart-crack-solid.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/heart-crack-solid.imageset/heart-crack-solid.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/heart-solid.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/heart-solid.imageset/heart-solid.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/hotjar-brands.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/hotjar-brands.imageset/hotjar-brands.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/jet-fighter-solid.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/jet-fighter-solid.imageset/jet-fighter-solid.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/lemon-solid.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/lemon-solid.imageset/lemon-solid.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/life-ring-solid.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/life-ring-solid.imageset/life-ring-solid.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/lightbulb-solid.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/lightbulb-solid.imageset/lightbulb-solid.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/location-crosshairs-solid.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/location-crosshairs-solid.imageset/location-crosshairs-solid.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/meh-regular.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/meh-regular.imageset/meh-regular.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/meteor-solid.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/meteor-solid.imageset/meteor-solid.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/microphone-solid.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/microphone-solid.imageset/microphone-solid.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/moon-solid.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/moon-solid.imageset/moon-solid.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/peace-solid.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/peace-solid.imageset/peace-solid.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/pizza-slice-solid.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/pizza-slice-solid.imageset/pizza-slice-solid.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/poo-solid.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/poo-solid.imageset/poo-solid.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/poo-storm-solid.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/poo-storm-solid.imageset/poo-storm-solid.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/rainbow-solid.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/rainbow-solid.imageset/rainbow-solid.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/sad-tear-regular.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/sad-tear-regular.imageset/sad-tear-regular.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/shuttle-space-solid.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/shuttle-space-solid.imageset/shuttle-space-solid.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/skull-crossbones-solid.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/skull-crossbones-solid.imageset/skull-crossbones-solid.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/skull-solid.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/skull-solid.imageset/skull-solid.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/smile-beam-regular.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/smile-beam-regular.imageset/smile-beam-regular.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/star-solid.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/star-solid.imageset/star-solid.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/virus-covid-solid.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/custom_icon/virus-covid-solid.imageset/virus-covid-solid.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/default_image/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/default_image/average.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/default_image/average.imageset/meh-regular.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/default_image/bad.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/default_image/bad.imageset/frown-regular.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/default_image/good.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/default_image/good.imageset/grin-regular.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/default_image/great.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/default_image/great.imageset/smile-beam-regular.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/default_image/horrible.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/default_image/horrible.imageset/sad-tear-regular.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/default_image/missing.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/default_image/missing.imageset/xmark-solid.png (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/default_image/xmark-solid.imageset/Contents.json (100%) rename {FeelsWidget2 => ReflectWidget}/Assets.xcassets/default_image/xmark-solid.imageset/xmark-solid.png (100%) rename FeelsWidget2/FeelsGraphicWidget.swift => ReflectWidget/ReflectGraphicWidget.swift (90%) rename FeelsWidget2/FeelsIconWidget.swift => ReflectWidget/ReflectIconWidget.swift (82%) rename FeelsWidget2/FeelsLiveActivity.swift => ReflectWidget/ReflectLiveActivity.swift (99%) rename FeelsWidget2/FeelsMoodControlWidget.swift => ReflectWidget/ReflectMoodControlWidget.swift (50%) rename FeelsWidget2/FeelsTimelineWidget.swift => ReflectWidget/ReflectTimelineWidget.swift (97%) rename FeelsWidget2/FeelsVoteWidget.swift => ReflectWidget/ReflectVoteWidget.swift (95%) rename FeelsWidget2/FeelsWidget.intentdefinition => ReflectWidget/ReflectWidget.intentdefinition (100%) create mode 100644 ReflectWidget/WidgetBundle.swift rename {FeelsWidget2 => ReflectWidget}/WidgetDataProvider.swift (93%) rename {FeelsWidget2 => ReflectWidget}/WidgetModels.swift (99%) rename {FeelsWidget2 => ReflectWidget}/WidgetProviders.swift (99%) rename {FeelsWidget2 => ReflectWidget}/WidgetSharedViews.swift (96%) rename FeelsWidgetExtension-Info.plist => ReflectWidgetExtension-Info.plist (100%) rename Feels Watch App/Feels Watch App.entitlements => ReflectWidgetExtension.entitlements (83%) rename Feels Watch App/Feels Watch AppDebug.entitlements => ReflectWidgetExtensionDev.entitlements (82%) rename Shared/Assets.xcassets/AppIcon.appiconset/{FeelsAppIcon 1.png => ReflectAppIcon 1.png} (100%) rename Shared/Assets.xcassets/AppIcon.appiconset/{FeelsAppIcon.png => ReflectAppIcon.png} (100%) rename Shared/Assets.xcassets/{FeelsAppIcon.imageset => ReflectAppIcon.imageset}/Contents.json (86%) rename Shared/Assets.xcassets/{FeelsAppIcon.imageset/FeelsAppIcon.png => ReflectAppIcon.imageset/ReflectAppIcon.png} (100%) rename Shared/{FeelsApp.swift => ReflectApp.swift} (96%) rename Shared/{FeelsTips.swift => ReflectTips.swift} (75%) rename Shared/Views/{FeelsSubscriptionStoreView.swift => ReflectSubscriptionStoreView.swift} (99%) rename docs/{Feels_QA_Test_Plan.xlsx => Reflect_QA_Test_Plan.xlsx} (100%) diff --git a/.gitignore b/.gitignore index 52986df..d9a3a31 100644 --- a/.gitignore +++ b/.gitignore @@ -77,4 +77,4 @@ Secrets.swift # Screenshots and promo assets /screens/ -feels-promo/ +reflect-promo/ diff --git a/AGENTS.md b/AGENTS.md index 499bac4..702f752 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,4 +1,4 @@ -# Feels Agent Instructions +# Reflect Agent Instructions ## XCUITest Workflows (Required) diff --git a/CLAUDE.md b/CLAUDE.md index c73da07..5b5aece 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,4 +1,4 @@ -# Feels +# Reflect iOS mood tracking app. Users rate their day on a 5-point scale (Horrible to Great) and view patterns via Day, Month, Year, and Insights views. Includes watchOS companion, widgets, Live Activities, and AI-powered insights. @@ -6,16 +6,16 @@ iOS mood tracking app. Users rate their day on a 5-point scale (Horrible to Grea ```bash # Build -xcodebuild -project Feels.xcodeproj -scheme "Feels (iOS)" -destination 'platform=iOS Simulator,name=iPhone 16 Pro' build +xcodebuild -project Reflect.xcodeproj -scheme "Reflect (iOS)" -destination 'platform=iOS Simulator,name=iPhone 17 Pro' build # Run all tests -xcodebuild -project Feels.xcodeproj -scheme "Feels (iOS)" -destination 'platform=iOS Simulator,name=iPhone 16 Pro' test +xcodebuild -project Reflect.xcodeproj -scheme "Reflect (iOS)" -destination 'platform=iOS Simulator,name=iPhone 17 Pro' test # Run a single test suite -xcodebuild -project Feels.xcodeproj -scheme "Feels (iOS)" -destination 'platform=iOS Simulator,name=iPhone 16 Pro' -only-testing:"Tests iOS/Tests_iOS" test +xcodebuild -project Reflect.xcodeproj -scheme "Reflect (iOS)" -destination 'platform=iOS Simulator,name=iPhone 17 Pro' -only-testing:"Tests iOS/Tests_iOS" test # Run a single test -xcodebuild -project Feels.xcodeproj -scheme "Feels (iOS)" -destination 'platform=iOS Simulator,name=iPhone 16 Pro' -only-testing:"Tests iOS/Tests_iOS/testDatesBetween" test +xcodebuild -project Reflect.xcodeproj -scheme "Reflect (iOS)" -destination 'platform=iOS Simulator,name=iPhone 17 Pro' -only-testing:"Tests iOS/Tests_iOS/testDatesBetween" test ``` ## Architecture Overview @@ -236,7 +236,7 @@ DataController.shared.add(mood: .good, forDate: date, entryType: .listView) ### Startup Flow -1. `FeelsApp.init()` — Configure `AnalyticsManager`, register `BGTaskScheduler`, reset `FeelsTipsManager`, initialize `LiveActivityScheduler`, initialize `WatchConnectivityManager` +1. `ReflectApp.init()` — Configure `AnalyticsManager`, register `BGTaskScheduler`, reset `ReflectTipsManager`, initialize `LiveActivityScheduler`, initialize `WatchConnectivityManager` 2. `MainTabView` receives `DataController.shared.container` as `modelContainer` 3. `IAPManager`, `BiometricAuthManager`, `HealthKitManager` injected as `@EnvironmentObject` 4. On `scenePhase` change to `.active` — `DataController.shared.refreshFromDisk()` picks up widget/watch changes @@ -247,7 +247,9 @@ DataController.shared.add(mood: .good, forDate: date, entryType: .listView) ### Framework & Location - **Framework**: XCTest -- **Test directory**: `Tests iOS/` (iOS), `Tests macOS/` (macOS — template only) +- **UI test directory**: `Tests iOS/` (XCUITest suites) +- **Unit test directory**: `ReflectTests/` (XCTest unit tests) +- **macOS tests**: `Tests macOS/` (template only) - **File naming**: `{SuiteName}Tests.swift` ### UI Test Architecture (XCUITest) @@ -277,10 +279,10 @@ Mandatory UI test rules: ```bash # Run one suite -xcodebuild -project Feels.xcodeproj -scheme "Feels (iOS)" -destination 'platform=iOS Simulator,name=iPhone 16 Pro' -only-testing:"Tests iOS/" test +xcodebuild -project Reflect.xcodeproj -scheme "Reflect (iOS)" -destination 'platform=iOS Simulator,name=iPhone 17 Pro' -only-testing:"Tests iOS/" test # Run all iOS UI tests -xcodebuild -project Feels.xcodeproj -scheme "Feels (iOS)" -destination 'platform=iOS Simulator,name=iPhone 16 Pro' -only-testing:"Tests iOS" test +xcodebuild -project Reflect.xcodeproj -scheme "Reflect (iOS)" -destination 'platform=iOS Simulator,name=iPhone 17 Pro' -only-testing:"Tests iOS" test ``` ### Unit Test Guidance @@ -343,7 +345,7 @@ When fixing a bug: | Background Tasks | `BGTask` | System scheduler | System may not run task, task killed by system, insufficient time | | Apple Foundation Models | `FoundationModelsInsightService` | On-device AI | Model not available on device, generation failure, unexpected output | | PostHog | `AnalyticsManager` | Network | analytics.88oakapps.com unreachable, event queue overflow | -| Deep Links | `FeelsApp.onOpenURL` | URL scheme `feels://` | Malformed URL, unknown host/path | +| Deep Links | `ReflectApp.onOpenURL` | URL scheme `reflect://` | Malformed URL, unknown host/path | | App Shortcuts / Siri | `AppShortcuts.swift` | SiriKit | Intent not recognized, missing parameter | ## Analytics @@ -373,13 +375,16 @@ AnalyticsManager.shared.trackScreen(.day) ## Environment Configuration -- **Debug**: Uses `iCloud.com.88oakapps.feels.debug` CloudKit container, `group.com.88oakapps.feels.debug` App Group, `Feels-Debug.store` filename -- **Production**: Uses `iCloud.com.88oakapps.feels` CloudKit container, `group.com.88oakapps.feels` App Group, `Feels.store` filename +- **Debug**: Uses `iCloud.com.88oakapps.reflect.debug` CloudKit container, `group.com.88oakapps.reflect.debug` App Group, `Reflect-Debug.store` filename +- **Production**: Uses `iCloud.com.88oakapps.reflect` CloudKit container, `group.com.88oakapps.reflect` App Group, `Reflect.store` filename - **Toggle**: `#if DEBUG` preprocessor directive in `SharedModelContainer` and throughout codebase - **StoreKit Testing**: `IAPManager.bypassSubscription` flag (DEBUG only) — set to `true` to bypass paywall during development - **Subscription Group ID**: `21914363` -- **Product IDs**: `com.88oakapps.feels.IAP.subscriptions.monthly`, `com.88oakapps.feels.IAP.subscriptions.yearly` +- **Product IDs**: `com.88oakapps.reflect.IAP.subscriptions.monthly`, `com.88oakapps.reflect.IAP.subscriptions.yearly` - **Trial**: 30-day free trial tracked via `firstLaunchDate` in `GroupUserDefaults` +- **URL Scheme**: `reflect://` (deep links: `reflect://subscribe`) +- **BGTask ID**: `com.88oakapps.reflect.dbUpdateMissing` +- **Logger Subsystem**: `com.88oakapps.reflect` ## Directory Conventions @@ -389,9 +394,10 @@ When adding new files: - New models: `Shared/Models/` - New services/managers: `Shared/Services/` - New persistence operations: `Shared/Persisence/DataController{OPERATION}.swift` (note directory typo) -- New widget code: `FeelsWidget2/` -- New watch code: `Feels Watch App/` -- New tests: `Tests iOS/` +- New widget code: `ReflectWidget/` +- New watch code: `Reflect Watch App/` +- New UI tests: `Tests iOS/` +- New unit tests: `ReflectTests/` ### Naming Conventions @@ -404,9 +410,10 @@ When adding new files: ## Localization -- English: `en.lproj/Localizable.strings` -- Spanish: `es.lproj/Localizable.strings` +- **Format**: String Catalogs (`Reflect/Localizable.xcstrings`) +- **Languages**: English (en), German (de), Spanish (es), French (fr), Japanese (ja), Korean (ko), Portuguese-Brazil (pt-BR) - Use `String(localized:)` for all user-facing strings +- "Reflect" is a brand name — keep it untranslated in all languages ## Dependencies diff --git a/Configuration.storekit b/Configuration.storekit index dfac922..fb3721f 100644 --- a/Configuration.storekit +++ b/Configuration.storekit @@ -39,7 +39,7 @@ "localizations" : [ ], - "name" : "Feels Premium", + "name" : "Reflect Premium", "subscriptions" : [ { "adHocOffers" : [ @@ -95,7 +95,7 @@ "locale" : "ko" } ], - "productID" : "com.88oakapps.feels.IAP.subscriptions.monthly", + "productID" : "com.88oakapps.reflect.IAP.subscriptions.monthly", "recurringSubscriptionPeriod" : "P1M", "referenceName" : "Monthly", "subscriptionGroupID" : "21914363", @@ -158,7 +158,7 @@ "locale" : "ko" } ], - "productID" : "com.88oakapps.feels.IAP.subscriptions.yearly", + "productID" : "com.88oakapps.reflect.IAP.subscriptions.yearly", "recurringSubscriptionPeriod" : "P1Y", "referenceName" : "Yearly", "subscriptionGroupID" : "21914363", diff --git a/Feels.xcodeproj/xcuserdata/treyt.xcuserdatad/xcschemes/xcschememanagement.plist b/Feels.xcodeproj/xcuserdata/treyt.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index cb40cc7..0000000 --- a/Feels.xcodeproj/xcuserdata/treyt.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,194 +0,0 @@ - - - - - SchemeUserState - - Feels (iOS).xcscheme_^#shared#^_ - - orderHint - 1 - - Feels (macOS).xcscheme_^#shared#^_ - - orderHint - 2 - - Feels Watch App.xcscheme_^#shared#^_ - - orderHint - 3 - - FeelsWidgetExtension.xcscheme_^#shared#^_ - - orderHint - 0 - - PlaygroundChart (Playground) 1.xcscheme - - isShown - - orderHint - 7 - - PlaygroundChart (Playground) 10.xcscheme - - isShown - - orderHint - 13 - - PlaygroundChart (Playground) 11.xcscheme - - isShown - - orderHint - 14 - - PlaygroundChart (Playground) 12.xcscheme - - isShown - - orderHint - 15 - - PlaygroundChart (Playground) 13.xcscheme - - isShown - - orderHint - 16 - - PlaygroundChart (Playground) 14.xcscheme - - isShown - - orderHint - 17 - - PlaygroundChart (Playground) 2.xcscheme - - isShown - - orderHint - 8 - - PlaygroundChart (Playground) 3.xcscheme - - isShown - - orderHint - 7 - - PlaygroundChart (Playground) 4.xcscheme - - isShown - - orderHint - 8 - - PlaygroundChart (Playground) 5.xcscheme - - isShown - - orderHint - 9 - - PlaygroundChart (Playground) 6.xcscheme - - isShown - - orderHint - 2 - - PlaygroundChart (Playground) 7.xcscheme - - isShown - - orderHint - 10 - - PlaygroundChart (Playground) 8.xcscheme - - isShown - - orderHint - 11 - - PlaygroundChart (Playground) 9.xcscheme - - isShown - - orderHint - 12 - - PlaygroundChart (Playground).xcscheme - - isShown - - orderHint - 6 - - Promises (Playground) 1.xcscheme - - isShown - - orderHint - 4 - - Promises (Playground) 2.xcscheme - - isShown - - orderHint - 5 - - Promises (Playground) 3.xcscheme - - isShown - - orderHint - 9 - - Promises (Playground) 4.xcscheme - - isShown - - orderHint - 10 - - Promises (Playground) 5.xcscheme - - isShown - - orderHint - 11 - - Promises (Playground).xcscheme - - isShown - - orderHint - 2 - - - SuppressBuildableAutocreation - - 1CD90AF4278C7DE0001C4FEA - - primary - - - 1CD90B01278C7DE0001C4FEA - - primary - - - 1CD90B44278C7E7A001C4FEA - - primary - - - - - diff --git a/FeelsWidget2/WidgetBundle.swift b/FeelsWidget2/WidgetBundle.swift deleted file mode 100644 index b0f2b2c..0000000 --- a/FeelsWidget2/WidgetBundle.swift +++ /dev/null @@ -1,21 +0,0 @@ -// -// WidgetBundle.swift -// FeelsWidget -// -// Main widget bundle that registers all Feels widgets -// - -import WidgetKit -import SwiftUI - -@main -struct FeelsBundle: WidgetBundle { - var body: some Widget { - FeelsWidget() -// FeelsGraphicWidget() - FeelsIconWidget() - FeelsVoteWidget() - FeelsMoodControlWidget() - MoodStreakLiveActivity() - } -} diff --git a/PROJECT_OVERVIEW.md b/PROJECT_OVERVIEW.md index 5f08d95..00aa587 100644 --- a/PROJECT_OVERVIEW.md +++ b/PROJECT_OVERVIEW.md @@ -1,8 +1,8 @@ -# Feels - iOS Mood Tracking App +# Reflect - iOS Mood Tracking App ## Overview -**Feels** is a daily mood tracking iOS application that allows users to rate their emotional state each day on a 5-point scale (Horrible, Bad, Average, Good, Great) and visualize patterns over time through multiple view modes. +**Reflect** is a daily mood tracking iOS application that allows users to rate their emotional state each day on a 5-point scale (Horrible, Bad, Average, Good, Great) and visualize patterns over time through multiple view modes. ## Core Features @@ -24,7 +24,7 @@ ### Project Structure ``` -Feels/ +Reflect/ ├── Shared/ # Core app code │ ├── Models/ # Data models (Mood, Theme, MoodTintable, etc.) │ ├── Views/ # SwiftUI views organized by feature @@ -36,7 +36,7 @@ Feels/ │ ├── Persisence/ # Core Data persistence layer │ ├── Onboarding/ # First-run experience │ └── Protocols/ # Protocol definitions -├── FeelsWidget/ # iOS Widget Extension (3 widget types) +├── ReflectWidget/ # iOS Widget Extension (3 widget types) ├── en.lproj/ # English localization ├── es.lproj/ # Spanish localization └── Tests iOS/ # Test targets @@ -49,12 +49,12 @@ Feels/ ### App Entry | File | Purpose | |------|---------| -| `FeelsApp.swift` | Main app entry, Core Data setup, IAP manager, tab navigation | +| `ReflectApp.swift` | Main app entry, Core Data setup, IAP manager, tab navigation | ### Data Layer | File | Purpose | |------|---------| -| `Feels.xcdatamodeld` | Core Data model with `MoodEntry` entity | +| `Reflect.xcdatamodeld` | Core Data model with `MoodEntry` entity | | `Persistence.swift` | Core Data stack, App Group container | | `PersistenceGET.swift` | Fetch operations | | `PersistenceADD.swift` | Create/fill missing entries | @@ -132,12 +132,12 @@ enum Mood: Int { ## Widget System -Three widget types in `FeelsWidget/`: -1. **FeelsWidget**: Small/Medium/Large showing recent moods -2. **FeelsGraphicWidget**: Small widget with mood graphic -3. **FeelsIconWidget**: Custom icon widget +Three widget types in `ReflectWidget/`: +1. **ReflectWidget**: Small/Medium/Large showing recent moods +2. **ReflectGraphicWidget**: Small widget with mood graphic +3. **ReflectIconWidget**: Custom icon widget -Data shared via App Groups: `group.com.88oakapps.feels` +Data shared via App Groups: `group.com.88oakapps.reflect` --- @@ -155,11 +155,11 @@ Data shared via App Groups: `group.com.88oakapps.feels` ## Configuration ### App Groups -- Production: `group.com.88oakapps.feels` -- Debug: `group.com.88oakapps.feels.debug` +- Production: `group.com.88oakapps.reflect` +- Debug: `group.com.88oakapps.reflect.debug` ### Background Tasks -- Identifier: `com.88oak.Feels.dbUpdateMissing` +- Identifier: `com.88oak.Reflect.dbUpdateMissing` ### StoreKit Products - Monthly subscription diff --git a/Feels (iOS).entitlements b/Reflect (iOS).entitlements similarity index 87% rename from Feels (iOS).entitlements rename to Reflect (iOS).entitlements index 7fd9805..55683bc 100644 --- a/Feels (iOS).entitlements +++ b/Reflect (iOS).entitlements @@ -12,7 +12,7 @@ com.apple.developer.icloud-container-identifiers - iCloud.com.88oakapps.feels + iCloud.com.88oakapps.reflect com.apple.developer.icloud-services @@ -20,7 +20,7 @@ com.apple.security.application-groups - group.com.88oakapps.feels + group.com.88oakapps.reflect diff --git a/Feels (iOS)Dev.entitlements b/Reflect (iOS)Dev.entitlements similarity index 84% rename from Feels (iOS)Dev.entitlements rename to Reflect (iOS)Dev.entitlements index 384b378..77a9e83 100644 --- a/Feels (iOS)Dev.entitlements +++ b/Reflect (iOS)Dev.entitlements @@ -10,7 +10,7 @@ com.apple.developer.icloud-container-identifiers - iCloud.com.88oakapps.feels.debug + iCloud.com.88oakapps.reflect.debug com.apple.developer.icloud-services @@ -18,7 +18,7 @@ com.apple.security.application-groups - group.com.88oakapps.feels.debug + group.com.88oakapps.reflect.debug diff --git a/Feels Watch App/Assets.xcassets/AppIcon.appiconset/AppIcon.png b/Reflect Watch App/Assets.xcassets/AppIcon.appiconset/AppIcon.png similarity index 100% rename from Feels Watch App/Assets.xcassets/AppIcon.appiconset/AppIcon.png rename to Reflect Watch App/Assets.xcassets/AppIcon.appiconset/AppIcon.png diff --git a/Feels Watch App/Assets.xcassets/AppIcon.appiconset/Contents.json b/Reflect Watch App/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from Feels Watch App/Assets.xcassets/AppIcon.appiconset/Contents.json rename to Reflect Watch App/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/Feels Watch App/Assets.xcassets/Contents.json b/Reflect Watch App/Assets.xcassets/Contents.json similarity index 100% rename from Feels Watch App/Assets.xcassets/Contents.json rename to Reflect Watch App/Assets.xcassets/Contents.json diff --git a/Feels Watch App/ContentView.swift b/Reflect Watch App/ContentView.swift similarity index 99% rename from Feels Watch App/ContentView.swift rename to Reflect Watch App/ContentView.swift index b9f5638..614d25e 100644 --- a/Feels Watch App/ContentView.swift +++ b/Reflect Watch App/ContentView.swift @@ -1,6 +1,6 @@ // // ContentView.swift -// Feels Watch App +// Reflect Watch App // // Main voting interface for logging moods on Apple Watch. // diff --git a/FeelsWidgetExtension.entitlements b/Reflect Watch App/Reflect Watch App.entitlements similarity index 83% rename from FeelsWidgetExtension.entitlements rename to Reflect Watch App/Reflect Watch App.entitlements index 43871d5..70a2e1c 100644 --- a/FeelsWidgetExtension.entitlements +++ b/Reflect Watch App/Reflect Watch App.entitlements @@ -6,7 +6,7 @@ development com.apple.developer.icloud-container-identifiers - iCloud.com.88oakapps.feels + iCloud.com.88oakapps.reflect com.apple.developer.icloud-services @@ -14,7 +14,7 @@ com.apple.security.application-groups - group.com.88oakapps.feels + group.com.88oakapps.reflect diff --git a/FeelsWidgetExtensionDev.entitlements b/Reflect Watch App/Reflect Watch AppDebug.entitlements similarity index 82% rename from FeelsWidgetExtensionDev.entitlements rename to Reflect Watch App/Reflect Watch AppDebug.entitlements index 0a2a3fd..88e3d63 100644 --- a/FeelsWidgetExtensionDev.entitlements +++ b/Reflect Watch App/Reflect Watch AppDebug.entitlements @@ -6,7 +6,7 @@ development com.apple.developer.icloud-container-identifiers - iCloud.com.88oakapps.feels.debug + iCloud.com.88oakapps.reflect.debug com.apple.developer.icloud-services @@ -14,7 +14,7 @@ com.apple.security.application-groups - group.com.88oakapps.feels.debug + group.com.88oakapps.reflect.debug diff --git a/Feels Watch App/FeelsComplication.swift b/Reflect Watch App/ReflectComplication.swift similarity index 80% rename from Feels Watch App/FeelsComplication.swift rename to Reflect Watch App/ReflectComplication.swift index 01e0acd..dad57f7 100644 --- a/Feels Watch App/FeelsComplication.swift +++ b/Reflect Watch App/ReflectComplication.swift @@ -1,6 +1,6 @@ // -// FeelsComplication.swift -// Feels Watch App +// ReflectComplication.swift +// Reflect Watch App // // WidgetKit complications for Apple Watch. // @@ -10,19 +10,19 @@ import SwiftUI // MARK: - Timeline Provider -struct FeelsTimelineProvider: TimelineProvider { - func placeholder(in context: Context) -> FeelsEntry { - FeelsEntry(date: Date(), mood: nil, streak: 0) +struct ReflectTimelineProvider: TimelineProvider { + func placeholder(in context: Context) -> ReflectEntry { + ReflectEntry(date: Date(), mood: nil, streak: 0) } - func getSnapshot(in context: Context, completion: @escaping (FeelsEntry) -> Void) { + func getSnapshot(in context: Context, completion: @escaping (ReflectEntry) -> Void) { Task { @MainActor in let entry = createEntry() completion(entry) } } - func getTimeline(in context: Context, completion: @escaping (Timeline) -> Void) { + func getTimeline(in context: Context, completion: @escaping (Timeline) -> Void) { Task { @MainActor in let entry = createEntry() @@ -37,11 +37,11 @@ struct FeelsTimelineProvider: TimelineProvider { } @MainActor - private func createEntry() -> FeelsEntry { + private func createEntry() -> ReflectEntry { let todayEntry = ExtensionDataProvider.shared.getTodayEntry() let streak = ExtensionDataProvider.shared.getCurrentStreak() - return FeelsEntry( + return ReflectEntry( date: Date(), mood: todayEntry?.mood, streak: streak @@ -51,7 +51,7 @@ struct FeelsTimelineProvider: TimelineProvider { // MARK: - Timeline Entry -struct FeelsEntry: TimelineEntry { +struct ReflectEntry: TimelineEntry { let date: Date let mood: Mood? let streak: Int @@ -59,8 +59,8 @@ struct FeelsEntry: TimelineEntry { // MARK: - Complication Views -struct FeelsComplicationEntryView: View { - var entry: FeelsEntry +struct ReflectComplicationEntryView: View { + var entry: ReflectEntry @Environment(\.widgetFamily) var family var body: some View { @@ -82,7 +82,7 @@ struct FeelsComplicationEntryView: View { // MARK: - Circular Complication struct CircularView: View { - let entry: FeelsEntry + let entry: ReflectEntry var body: some View { ZStack { @@ -106,7 +106,7 @@ struct CircularView: View { // MARK: - Corner Complication struct CornerView: View { - let entry: FeelsEntry + let entry: ReflectEntry var body: some View { if let mood = entry.mood { @@ -128,7 +128,7 @@ struct CornerView: View { // MARK: - Inline Complication struct InlineView: View { - let entry: FeelsEntry + let entry: ReflectEntry var body: some View { if entry.streak > 0 { @@ -144,7 +144,7 @@ struct InlineView: View { // MARK: - Rectangular Complication struct RectangularView: View { - let entry: FeelsEntry + let entry: ReflectEntry var body: some View { HStack { @@ -170,7 +170,7 @@ struct RectangularView: View { .font(.system(size: 24)) VStack(alignment: .leading, spacing: 2) { - Text("Feels") + Text("Reflect") .font(.system(size: 14, weight: .semibold)) Text("Tap to log mood") .font(.system(size: 12)) @@ -185,15 +185,15 @@ struct RectangularView: View { // MARK: - Widget Configuration -struct FeelsComplication: Widget { - let kind: String = "FeelsComplication" +struct ReflectComplication: Widget { + let kind: String = "ReflectComplication" var body: some WidgetConfiguration { - StaticConfiguration(kind: kind, provider: FeelsTimelineProvider()) { entry in - FeelsComplicationEntryView(entry: entry) + StaticConfiguration(kind: kind, provider: ReflectTimelineProvider()) { entry in + ReflectComplicationEntryView(entry: entry) .containerBackground(.fill.tertiary, for: .widget) } - .configurationDisplayName("Feels") + .configurationDisplayName("Reflect") .description("See today's mood and streak.") .supportedFamilies([ .accessoryCircular, @@ -207,26 +207,26 @@ struct FeelsComplication: Widget { // MARK: - Preview #Preview("Circular - Mood") { - CircularView(entry: FeelsEntry(date: Date(), mood: .great, streak: 5)) + CircularView(entry: ReflectEntry(date: Date(), mood: .great, streak: 5)) .previewContext(WidgetPreviewContext(family: .accessoryCircular)) } #Preview("Circular - Empty") { - CircularView(entry: FeelsEntry(date: Date(), mood: nil, streak: 0)) + CircularView(entry: ReflectEntry(date: Date(), mood: nil, streak: 0)) .previewContext(WidgetPreviewContext(family: .accessoryCircular)) } #Preview("Rectangular - Mood") { - RectangularView(entry: FeelsEntry(date: Date(), mood: .good, streak: 7)) + RectangularView(entry: ReflectEntry(date: Date(), mood: .good, streak: 7)) .previewContext(WidgetPreviewContext(family: .accessoryRectangular)) } #Preview("Inline - Streak") { - InlineView(entry: FeelsEntry(date: Date(), mood: .great, streak: 5)) + InlineView(entry: ReflectEntry(date: Date(), mood: .great, streak: 5)) .previewContext(WidgetPreviewContext(family: .accessoryInline)) } #Preview("Corner - Mood") { - CornerView(entry: FeelsEntry(date: Date(), mood: .average, streak: 3)) + CornerView(entry: ReflectEntry(date: Date(), mood: .average, streak: 3)) .previewContext(WidgetPreviewContext(family: .accessoryCorner)) } diff --git a/Feels Watch App/FeelsWatchApp.swift b/Reflect Watch App/ReflectWatchApp.swift similarity index 80% rename from Feels Watch App/FeelsWatchApp.swift rename to Reflect Watch App/ReflectWatchApp.swift index 4cad729..6febdbe 100644 --- a/Feels Watch App/FeelsWatchApp.swift +++ b/Reflect Watch App/ReflectWatchApp.swift @@ -1,6 +1,6 @@ // -// FeelsWatchApp.swift -// Feels Watch App +// ReflectWatchApp.swift +// Reflect Watch App // // Entry point for the Apple Watch companion app. // @@ -8,7 +8,7 @@ import SwiftUI @main -struct FeelsWatchApp: App { +struct ReflectWatchApp: App { init() { // Initialize Watch Connectivity for cross-device widget updates diff --git a/Feels--iOS--Info.plist b/Reflect--iOS--Info.plist similarity index 81% rename from Feels--iOS--Info.plist rename to Reflect--iOS--Info.plist index 6b0dfca..aaeefa3 100644 --- a/Feels--iOS--Info.plist +++ b/Reflect--iOS--Info.plist @@ -4,16 +4,16 @@ BGTaskSchedulerPermittedIdentifiers - com.tt.feels.dbUpdateMissing + com.88oakapps.reflect.dbUpdateMissing CFBundleURLTypes CFBundleURLName - com.tt.feels + com.88oakapps.reflect CFBundleURLSchemes - feels + reflect diff --git a/Feels.xcodeproj/project.pbxproj b/Reflect.xcodeproj/project.pbxproj similarity index 86% rename from Feels.xcodeproj/project.pbxproj rename to Reflect.xcodeproj/project.pbxproj index c07210f..d73f817 100644 --- a/Feels.xcodeproj/project.pbxproj +++ b/Reflect.xcodeproj/project.pbxproj @@ -11,8 +11,8 @@ 141C5C51CA0658F682E984F5 /* ReduceMotionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C8D04ACF01F539EA572EEB8 /* ReduceMotionTests.swift */; }; 19F8D7CA5D384E82A4BB4BCA /* YearViewHeatmapTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D9475CC3818201762FA57D91 /* YearViewHeatmapTests.swift */; }; 1AB245144C89927264D16645 /* InsightsEmptyStateTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A6988985985DE9C29CFDFA96 /* InsightsEmptyStateTests.swift */; }; - 1C0DAB51279DB0FB003B1F21 /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 1C0DAB50279DB0FB003B1F21 /* Localizable.xcstrings */; }; - 1C0DAB52279DB0FB003B1F22 /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 1C0DAB50279DB0FB003B1F21 /* Localizable.xcstrings */; }; + 1C0DAB51279DB0FB003B1F21 /* Reflect/Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 1C0DAB50279DB0FB003B1F21 /* Reflect/Localizable.xcstrings */; }; + 1C0DAB52279DB0FB003B1F22 /* Reflect/Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 1C0DAB50279DB0FB003B1F21 /* Reflect/Localizable.xcstrings */; }; 1C9566442EF8F5F70032E68F /* Algorithms in Frameworks */ = {isa = PBXBuildFile; productRef = 1C9566432EF8F5F70032E68F /* Algorithms */; }; 1CB4D0A028787D8A00902A56 /* StoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1CB4D09F28787D8A00902A56 /* StoreKit.framework */; }; 1CD90B07278C7DE0001C4FEA /* Tests_iOS.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CD90B06278C7DE0001C4FEA /* Tests_iOS.swift */; }; @@ -21,7 +21,7 @@ 1CD90B15278C7DE0001C4FEA /* Tests_macOSLaunchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CD90B14278C7DE0001C4FEA /* Tests_macOSLaunchTests.swift */; }; 1CD90B48278C7E7A001C4FEA /* WidgetKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1CD90B47278C7E7A001C4FEA /* WidgetKit.framework */; platformFilter = maccatalyst; }; 1CD90B4A278C7E7A001C4FEA /* SwiftUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1CD90B49278C7E7A001C4FEA /* SwiftUI.framework */; platformFilter = maccatalyst; }; - 1CD90B56278C7E7A001C4FEA /* FeelsWidgetExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 1CD90B45278C7E7A001C4FEA /* FeelsWidgetExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 1CD90B56278C7E7A001C4FEA /* ReflectWidgetExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 1CD90B45278C7E7A001C4FEA /* ReflectWidgetExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 1CD90B6C278C7F78001C4FEA /* CloudKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1CD90B6B278C7F78001C4FEA /* CloudKit.framework */; }; 1CD90B6E278C7F8B001C4FEA /* CloudKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1CD90B6B278C7F78001C4FEA /* CloudKit.framework */; }; 1CDE000F2F3BBD26006AE6A1 /* PostHog in Frameworks */ = {isa = PBXBuildFile; productRef = 1CA00002300000000000002A /* PostHog */; }; @@ -96,28 +96,28 @@ containerPortal = 1CD90AE6278C7DDF001C4FEA /* Project object */; proxyType = 1; remoteGlobalIDString = 1CD90AF4278C7DE0001C4FEA; - remoteInfo = "Feels (iOS)"; + remoteInfo = "Reflect (iOS)"; }; 1CD90B0F278C7DE0001C4FEA /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 1CD90AE6278C7DDF001C4FEA /* Project object */; proxyType = 1; remoteGlobalIDString = 1CD90AFA278C7DE0001C4FEA; - remoteInfo = "Feels (macOS)"; + remoteInfo = "Reflect (macOS)"; }; 1CD90B54278C7E7A001C4FEA /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 1CD90AE6278C7DDF001C4FEA /* Project object */; proxyType = 1; remoteGlobalIDString = 1CD90B44278C7E7A001C4FEA; - remoteInfo = FeelsWidgetExtension; + remoteInfo = ReflectWidgetExtension; }; A0B973C7674930232515563A /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 1CD90AE6278C7DDF001C4FEA /* Project object */; proxyType = 1; remoteGlobalIDString = 1CD90AF4278C7DE0001C4FEA; - remoteInfo = "Feels (iOS)"; + remoteInfo = "Reflect (iOS)"; }; /* End PBXContainerItemProxy section */ @@ -128,7 +128,7 @@ dstPath = ""; dstSubfolderSpec = 13; files = ( - 1CD90B56278C7E7A001C4FEA /* FeelsWidgetExtension.appex in Embed Foundation Extensions */, + 1CD90B56278C7E7A001C4FEA /* ReflectWidgetExtension.appex in Embed Foundation Extensions */, ); name = "Embed Foundation Extensions"; runOnlyForDeploymentPostprocessing = 0; @@ -139,10 +139,10 @@ 0246E9F406F872E5DEEB7269 /* YearViewDisplayTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = YearViewDisplayTests.swift; sourceTree = ""; }; 0359E1D32D936859E5A0C9F3 /* AppResumeTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppResumeTests.swift; sourceTree = ""; }; 17DC4C498A1185DC831F4593 /* LocalizationTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalizationTests.swift; sourceTree = ""; }; - 1C0DAB50279DB0FB003B1F21 /* Localizable.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = Feels/Localizable.xcstrings; sourceTree = ""; }; + 1C0DAB50279DB0FB003B1F21 /* Reflect/Localizable.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = Reflect/Localizable.xcstrings; sourceTree = ""; }; 1CB4D09F28787D8A00902A56 /* StoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = StoreKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS15.5.sdk/System/Library/Frameworks/StoreKit.framework; sourceTree = DEVELOPER_DIR; }; - 1CD90AF5278C7DE0001C4FEA /* Feels.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Feels.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 1CD90AFB278C7DE0001C4FEA /* Feels.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Feels.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 1CD90AF5278C7DE0001C4FEA /* Reflect.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Reflect.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 1CD90AFB278C7DE0001C4FEA /* Reflect.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Reflect.app; sourceTree = BUILT_PRODUCTS_DIR; }; 1CD90AFD278C7DE0001C4FEA /* macOS.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = macOS.entitlements; sourceTree = ""; }; 1CD90B02278C7DE0001C4FEA /* Tests iOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Tests iOS.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 1CD90B06278C7DE0001C4FEA /* Tests_iOS.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tests_iOS.swift; sourceTree = ""; }; @@ -150,17 +150,17 @@ 1CD90B0E278C7DE0001C4FEA /* Tests macOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Tests macOS.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 1CD90B12278C7DE0001C4FEA /* Tests_macOS.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tests_macOS.swift; sourceTree = ""; }; 1CD90B14278C7DE0001C4FEA /* Tests_macOSLaunchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tests_macOSLaunchTests.swift; sourceTree = ""; }; - 1CD90B45278C7E7A001C4FEA /* FeelsWidgetExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = FeelsWidgetExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; + 1CD90B45278C7E7A001C4FEA /* ReflectWidgetExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = ReflectWidgetExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; 1CD90B47278C7E7A001C4FEA /* WidgetKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WidgetKit.framework; path = System/Library/Frameworks/WidgetKit.framework; sourceTree = SDKROOT; }; 1CD90B49278C7E7A001C4FEA /* SwiftUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SwiftUI.framework; path = System/Library/Frameworks/SwiftUI.framework; sourceTree = SDKROOT; }; - 1CD90B69278C7F65001C4FEA /* Feels--iOS--Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "Feels--iOS--Info.plist"; sourceTree = ""; }; - 1CD90B6A278C7F75001C4FEA /* Feels (iOS).entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "Feels (iOS).entitlements"; sourceTree = ""; }; + 1CD90B69278C7F65001C4FEA /* Reflect--iOS--Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "Reflect--iOS--Info.plist"; sourceTree = ""; }; + 1CD90B6A278C7F75001C4FEA /* Reflect (iOS).entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "Reflect (iOS).entitlements"; sourceTree = ""; }; 1CD90B6B278C7F78001C4FEA /* CloudKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CloudKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS15.2.sdk/System/Library/Frameworks/CloudKit.framework; sourceTree = DEVELOPER_DIR; }; - 1CD90B6D278C7F89001C4FEA /* FeelsWidgetExtension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = FeelsWidgetExtension.entitlements; sourceTree = ""; }; - 1CD90B6F278C8000001C4FEA /* FeelsWidgetExtensionDev.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = FeelsWidgetExtensionDev.entitlements; sourceTree = ""; }; - 1CD90B70278C8000001C4FEA /* Feels (iOS)Dev.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = "Feels (iOS)Dev.entitlements"; sourceTree = ""; }; + 1CD90B6D278C7F89001C4FEA /* ReflectWidgetExtension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = ReflectWidgetExtension.entitlements; sourceTree = ""; }; + 1CD90B6F278C8000001C4FEA /* ReflectWidgetExtensionDev.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = ReflectWidgetExtensionDev.entitlements; sourceTree = ""; }; + 1CD90B70278C8000001C4FEA /* Reflect (iOS)Dev.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = "Reflect (iOS)Dev.entitlements"; sourceTree = ""; }; 1CDEFBBE2F3B8736006AE6A1 /* Configuration.storekit */ = {isa = PBXFileReference; lastKnownFileType = text; path = Configuration.storekit; sourceTree = ""; }; - 1E594AEAB5F046E3B3ED7C47 /* Feels Watch App.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Feels Watch App.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 1E594AEAB5F046E3B3ED7C47 /* Reflect Watch App.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Reflect Watch App.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 21CD463209E0909393545D62 /* TrialBannerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrialBannerTests.swift; sourceTree = ""; }; 29CE4110A0D8FBBAD7F92BDF /* BaseUITestCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseUITestCase.swift; sourceTree = ""; }; 29E2A2FC314F88244CA946BF /* StreakTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = StreakTests.swift; sourceTree = ""; }; @@ -191,8 +191,8 @@ B0C1D2E3F4A5B6C7D8E9FA0B /* AllDayViewStylesTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AllDayViewStylesTests.swift; sourceTree = ""; }; B2C3D4E5F6A7B8C9D0E1F2A3 /* CustomizeScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomizeScreen.swift; sourceTree = ""; }; B4C5D6E7F8A9B0C1D2E3F4A5 /* PaywallGateTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PaywallGateTests.swift; sourceTree = ""; }; - B60015D02A064FF582E232FD /* Feels Watch AppDebug.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "Feels Watch App/Feels Watch AppDebug.entitlements"; sourceTree = ""; }; - B8AB4CD73C2B4DC89C6FE84D /* Feels Watch App.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "Feels Watch App/Feels Watch App.entitlements"; sourceTree = ""; }; + B60015D02A064FF582E232FD /* Reflect Watch App/Reflect Watch AppDebug.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "Reflect Watch App/Reflect Watch AppDebug.entitlements"; sourceTree = ""; }; + B8AB4CD73C2B4DC89C6FE84D /* Reflect Watch App/Reflect Watch App.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "Reflect Watch App/Reflect Watch App.entitlements"; sourceTree = ""; }; B8C9D0E1F2A3B4C5D6E7F8A9 /* MonthViewTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MonthViewTests.swift; sourceTree = ""; }; BB22222222222222BBBBBBBB /* MoodLoggingEmptyStateTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoodLoggingEmptyStateTests.swift; sourceTree = ""; }; BE4D06D4E7188339DE8BC040 /* SettingsLegalLinksTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SettingsLegalLinksTests.swift; sourceTree = ""; }; @@ -208,7 +208,7 @@ D4E5F6A7B8C9D0E1F2A3B4C5 /* MoodReplacementTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoodReplacementTests.swift; sourceTree = ""; }; D6E7F8A9B0C1D2E3F4A5B6C7 /* IconPackTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IconPackTests.swift; sourceTree = ""; }; D9475CC3818201762FA57D91 /* YearViewHeatmapTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = YearViewHeatmapTests.swift; sourceTree = ""; }; - DA0D74ACDD741CFA1F14F50F /* FeelsTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = FeelsTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + DA0D74ACDD741CFA1F14F50F /* ReflectTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ReflectTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; DA7E6C56A47EB49419BFA77C /* LongTranslationTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = LongTranslationTests.swift; sourceTree = ""; }; DD44444444444444DDDDDDDD /* EntryDetailTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EntryDetailTests.swift; sourceTree = ""; }; DD717F91BD65382B7DDFE3C4 /* VoteLogicsTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = VoteLogicsTests.swift; sourceTree = ""; }; @@ -228,7 +228,7 @@ /* End PBXFileReference section */ /* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ - 1C000C162EE93AE3009C9ED5 /* Exceptions for "Shared" folder in "FeelsWidgetExtension" target */ = { + 1C000C162EE93AE3009C9ED5 /* PBXFileSystemSynchronizedBuildFileExceptionSet */ = { isa = PBXFileSystemSynchronizedBuildFileExceptionSet; membershipExceptions = ( AccessibilityIdentifiers.swift, @@ -257,9 +257,9 @@ Views/CustomWidget/CustomWidgetModel.swift, Views/CustomWidget/CustomWidgetView.swift, ); - target = 1CD90B44278C7E7A001C4FEA /* FeelsWidgetExtension */; + target = 1CD90B44278C7E7A001C4FEA /* ReflectWidgetExtension */; }; - 2166CE8AA7264FC2B4BFAAAC /* Exceptions for "Shared" folder in "Feels Watch App" target */ = { + 2166CE8AA7264FC2B4BFAAAC /* PBXFileSystemSynchronizedBuildFileExceptionSet */ = { isa = PBXFileSystemSynchronizedBuildFileExceptionSet; membershipExceptions = ( Models/Mood.swift, @@ -269,46 +269,14 @@ Services/WatchConnectivityManager.swift, SharedMoodIntent.swift, ); - target = B1DB9E6543DE4A009DB00916 /* Feels Watch App */; + target = B1DB9E6543DE4A009DB00916 /* Reflect Watch App */; }; /* End PBXFileSystemSynchronizedBuildFileExceptionSet section */ /* Begin PBXFileSystemSynchronizedRootGroup section */ - 1C00073D2EE9388A009C9ED5 /* Shared */ = { - isa = PBXFileSystemSynchronizedRootGroup; - exceptions = ( - 2166CE8AA7264FC2B4BFAAAC /* Exceptions for "Shared" folder in "Feels Watch App" target */, - 1C000C162EE93AE3009C9ED5 /* Exceptions for "Shared" folder in "FeelsWidgetExtension" target */, - ); - explicitFileTypes = { - }; - explicitFolders = ( - ); - path = Shared; - sourceTree = ""; - }; - 1C0009922EE938FC009C9ED5 /* FeelsWidget2 */ = { - isa = PBXFileSystemSynchronizedRootGroup; - exceptions = ( - ); - explicitFileTypes = { - }; - explicitFolders = ( - ); - path = FeelsWidget2; - sourceTree = ""; - }; - 579031D619ED4B989145EEB1 /* Feels Watch App */ = { - isa = PBXFileSystemSynchronizedRootGroup; - exceptions = ( - ); - explicitFileTypes = { - }; - explicitFolders = ( - ); - path = "Feels Watch App"; - sourceTree = ""; - }; + 1C00073D2EE9388A009C9ED5 /* Shared */ = {isa = PBXFileSystemSynchronizedRootGroup; exceptions = (2166CE8AA7264FC2B4BFAAAC /* PBXFileSystemSynchronizedBuildFileExceptionSet */, 1C000C162EE93AE3009C9ED5 /* PBXFileSystemSynchronizedBuildFileExceptionSet */, ); explicitFileTypes = {}; explicitFolders = (); path = Shared; sourceTree = ""; }; + 1C0009922EE938FC009C9ED5 /* ReflectWidget */ = {isa = PBXFileSystemSynchronizedRootGroup; explicitFileTypes = {}; explicitFolders = (); path = ReflectWidget; sourceTree = ""; }; + 579031D619ED4B989145EEB1 /* Reflect Watch App */ = {isa = PBXFileSystemSynchronizedRootGroup; explicitFileTypes = {}; explicitFolders = (); path = "Reflect Watch App"; sourceTree = ""; }; /* End PBXFileSystemSynchronizedRootGroup section */ /* Begin PBXFrameworksBuildPhase section */ @@ -376,37 +344,37 @@ 1CD90AE5278C7DDF001C4FEA = { isa = PBXGroup; children = ( - B8AB4CD73C2B4DC89C6FE84D /* Feels Watch App.entitlements */, - B60015D02A064FF582E232FD /* Feels Watch AppDebug.entitlements */, - 1C0DAB50279DB0FB003B1F21 /* Localizable.xcstrings */, + B8AB4CD73C2B4DC89C6FE84D /* Reflect Watch App/Reflect Watch App.entitlements */, + B60015D02A064FF582E232FD /* Reflect Watch App/Reflect Watch AppDebug.entitlements */, + 1C0DAB50279DB0FB003B1F21 /* Reflect/Localizable.xcstrings */, 1CDEFBBE2F3B8736006AE6A1 /* Configuration.storekit */, - 1CD90B6A278C7F75001C4FEA /* Feels (iOS).entitlements */, - 1CD90B70278C8000001C4FEA /* Feels (iOS)Dev.entitlements */, - 1CD90B6D278C7F89001C4FEA /* FeelsWidgetExtension.entitlements */, - 1CD90B6F278C8000001C4FEA /* FeelsWidgetExtensionDev.entitlements */, - 1CD90B69278C7F65001C4FEA /* Feels--iOS--Info.plist */, - 579031D619ED4B989145EEB1 /* Feels Watch App */, + 1CD90B6A278C7F75001C4FEA /* Reflect (iOS).entitlements */, + 1CD90B70278C8000001C4FEA /* Reflect (iOS)Dev.entitlements */, + 1CD90B6D278C7F89001C4FEA /* ReflectWidgetExtension.entitlements */, + 1CD90B6F278C8000001C4FEA /* ReflectWidgetExtensionDev.entitlements */, + 1CD90B69278C7F65001C4FEA /* Reflect--iOS--Info.plist */, + 579031D619ED4B989145EEB1 /* Reflect Watch App */, 1C00073D2EE9388A009C9ED5 /* Shared */, - 1C0009922EE938FC009C9ED5 /* FeelsWidget2 */, + 1C0009922EE938FC009C9ED5 /* ReflectWidget */, 1CD90AFC278C7DE0001C4FEA /* macOS */, 1CD90B05278C7DE0001C4FEA /* Tests iOS */, 1CD90B11278C7DE0001C4FEA /* Tests macOS */, 1CD90B46278C7E7A001C4FEA /* Frameworks */, 1CD90AF6278C7DE0001C4FEA /* Products */, - 38D005587E22737DC6291955 /* FeelsTests */, + 38D005587E22737DC6291955 /* ReflectTests */, ); sourceTree = ""; }; 1CD90AF6278C7DE0001C4FEA /* Products */ = { isa = PBXGroup; children = ( - 1E594AEAB5F046E3B3ED7C47 /* Feels Watch App.app */, - 1CD90AF5278C7DE0001C4FEA /* Feels.app */, - 1CD90AFB278C7DE0001C4FEA /* Feels.app */, + 1E594AEAB5F046E3B3ED7C47 /* Reflect Watch App.app */, + 1CD90AF5278C7DE0001C4FEA /* Reflect.app */, + 1CD90AFB278C7DE0001C4FEA /* Reflect.app */, 1CD90B02278C7DE0001C4FEA /* Tests iOS.xctest */, 1CD90B0E278C7DE0001C4FEA /* Tests macOS.xctest */, - 1CD90B45278C7E7A001C4FEA /* FeelsWidgetExtension.appex */, - DA0D74ACDD741CFA1F14F50F /* FeelsTests.xctest */, + 1CD90B45278C7E7A001C4FEA /* ReflectWidgetExtension.appex */, + DA0D74ACDD741CFA1F14F50F /* ReflectTests.xctest */, ); name = Products; sourceTree = ""; @@ -500,7 +468,7 @@ name = Frameworks; sourceTree = ""; }; - 38D005587E22737DC6291955 /* FeelsTests */ = { + 38D005587E22737DC6291955 /* ReflectTests */ = { isa = PBXGroup; children = ( 5566271983AEDF1D33C34FE6 /* DataControllerCRUDTests.swift */, @@ -509,7 +477,7 @@ 29E2A2FC314F88244CA946BF /* StreakTests.swift */, DD717F91BD65382B7DDFE3C4 /* VoteLogicsTests.swift */, ); - path = FeelsTests; + path = ReflectTests; sourceTree = ""; }; 3A62ED77167DA212DE1CCB7D /* Helpers */ = { @@ -546,9 +514,9 @@ /* End PBXGroup section */ /* Begin PBXNativeTarget section */ - 1CD90AF4278C7DE0001C4FEA /* Feels (iOS) */ = { + 1CD90AF4278C7DE0001C4FEA /* Reflect (iOS) */ = { isa = PBXNativeTarget; - buildConfigurationList = 1CD90B22278C7DE0001C4FEA /* Build configuration list for PBXNativeTarget "Feels (iOS)" */; + buildConfigurationList = 1CD90B22278C7DE0001C4FEA /* Build configuration list for PBXNativeTarget "Reflect (iOS)" */; buildPhases = ( 1CD90AF1278C7DE0001C4FEA /* Sources */, 1CD90AF2278C7DE0001C4FEA /* Frameworks */, @@ -563,18 +531,18 @@ fileSystemSynchronizedGroups = ( 1C00073D2EE9388A009C9ED5 /* Shared */, ); - name = "Feels (iOS)"; + name = "Reflect (iOS)"; packageProductDependencies = ( 1C9566432EF8F5F70032E68F /* Algorithms */, 1CA00002300000000000002A /* PostHog */, ); - productName = "Feels (iOS)"; - productReference = 1CD90AF5278C7DE0001C4FEA /* Feels.app */; + productName = "Reflect (iOS)"; + productReference = 1CD90AF5278C7DE0001C4FEA /* Reflect.app */; productType = "com.apple.product-type.application"; }; - 1CD90AFA278C7DE0001C4FEA /* Feels (macOS) */ = { + 1CD90AFA278C7DE0001C4FEA /* Reflect (macOS) */ = { isa = PBXNativeTarget; - buildConfigurationList = 1CD90B25278C7DE0001C4FEA /* Build configuration list for PBXNativeTarget "Feels (macOS)" */; + buildConfigurationList = 1CD90B25278C7DE0001C4FEA /* Build configuration list for PBXNativeTarget "Reflect (macOS)" */; buildPhases = ( 1CD90AF7278C7DE0001C4FEA /* Sources */, 1CD90AF8278C7DE0001C4FEA /* Frameworks */, @@ -584,9 +552,9 @@ ); dependencies = ( ); - name = "Feels (macOS)"; - productName = "Feels (macOS)"; - productReference = 1CD90AFB278C7DE0001C4FEA /* Feels.app */; + name = "Reflect (macOS)"; + productName = "Reflect (macOS)"; + productReference = 1CD90AFB278C7DE0001C4FEA /* Reflect.app */; productType = "com.apple.product-type.application"; }; 1CD90B01278C7DE0001C4FEA /* Tests iOS */ = { @@ -625,9 +593,9 @@ productReference = 1CD90B0E278C7DE0001C4FEA /* Tests macOS.xctest */; productType = "com.apple.product-type.bundle.ui-testing"; }; - 1CD90B44278C7E7A001C4FEA /* FeelsWidgetExtension */ = { + 1CD90B44278C7E7A001C4FEA /* ReflectWidgetExtension */ = { isa = PBXNativeTarget; - buildConfigurationList = 1CD90B57278C7E7A001C4FEA /* Build configuration list for PBXNativeTarget "FeelsWidgetExtension" */; + buildConfigurationList = 1CD90B57278C7E7A001C4FEA /* Build configuration list for PBXNativeTarget "ReflectWidgetExtension" */; buildPhases = ( 1CD90B41278C7E7A001C4FEA /* Sources */, 1CD90B42278C7E7A001C4FEA /* Frameworks */, @@ -638,16 +606,16 @@ dependencies = ( ); fileSystemSynchronizedGroups = ( - 1C0009922EE938FC009C9ED5 /* FeelsWidget2 */, + 1C0009922EE938FC009C9ED5 /* ReflectWidget */, ); - name = FeelsWidgetExtension; - productName = FeelsWidgetExtension; - productReference = 1CD90B45278C7E7A001C4FEA /* FeelsWidgetExtension.appex */; + name = ReflectWidgetExtension; + productName = ReflectWidgetExtension; + productReference = 1CD90B45278C7E7A001C4FEA /* ReflectWidgetExtension.appex */; productType = "com.apple.product-type.app-extension"; }; - B1DB9E6543DE4A009DB00916 /* Feels Watch App */ = { + B1DB9E6543DE4A009DB00916 /* Reflect Watch App */ = { isa = PBXNativeTarget; - buildConfigurationList = 1B7D3790BF564C5392D480B2 /* Build configuration list for PBXNativeTarget "Feels Watch App" */; + buildConfigurationList = 1B7D3790BF564C5392D480B2 /* Build configuration list for PBXNativeTarget "Reflect Watch App" */; buildPhases = ( 0C4FBA03AAF5412783DD72AF /* Sources */, 28189547ACED4EA2B5842F91 /* Frameworks */, @@ -658,16 +626,16 @@ dependencies = ( ); fileSystemSynchronizedGroups = ( - 579031D619ED4B989145EEB1 /* Feels Watch App */, + 579031D619ED4B989145EEB1 /* Reflect Watch App */, ); - name = "Feels Watch App"; - productName = "Feels Watch App"; - productReference = 1E594AEAB5F046E3B3ED7C47 /* Feels Watch App.app */; + name = "Reflect Watch App"; + productName = "Reflect Watch App"; + productReference = 1E594AEAB5F046E3B3ED7C47 /* Reflect Watch App.app */; productType = "com.apple.product-type.application"; }; - B375A511826E3AB53E2CF51A /* FeelsTests */ = { + B375A511826E3AB53E2CF51A /* ReflectTests */ = { isa = PBXNativeTarget; - buildConfigurationList = 611E0B1E1241C11626465A8D /* Build configuration list for PBXNativeTarget "FeelsTests" */; + buildConfigurationList = 611E0B1E1241C11626465A8D /* Build configuration list for PBXNativeTarget "ReflectTests" */; buildPhases = ( 681C769809C145ECC6A2AE8B /* Sources */, 0DC68E3188164EBC373A6BF3 /* Frameworks */, @@ -678,9 +646,9 @@ dependencies = ( 946F2D1B29B91CD7DB732908 /* PBXTargetDependency */, ); - name = FeelsTests; - productName = FeelsTests; - productReference = DA0D74ACDD741CFA1F14F50F /* FeelsTests.xctest */; + name = ReflectTests; + productName = ReflectTests; + productReference = DA0D74ACDD741CFA1F14F50F /* ReflectTests.xctest */; productType = "com.apple.product-type.bundle.unit-test"; }; /* End PBXNativeTarget section */ @@ -719,7 +687,7 @@ }; }; }; - buildConfigurationList = 1CD90AE9278C7DDF001C4FEA /* Build configuration list for PBXProject "Feels" */; + buildConfigurationList = 1CD90AE9278C7DDF001C4FEA /* Build configuration list for PBXProject "Reflect" */; compatibilityVersion = "Xcode 13.0"; developmentRegion = en; hasScannedForEncodings = 0; @@ -742,13 +710,13 @@ projectDirPath = ""; projectRoot = ""; targets = ( - 1CD90AF4278C7DE0001C4FEA /* Feels (iOS) */, - B1DB9E6543DE4A009DB00916 /* Feels Watch App */, - 1CD90B44278C7E7A001C4FEA /* FeelsWidgetExtension */, - 1CD90AFA278C7DE0001C4FEA /* Feels (macOS) */, + 1CD90AF4278C7DE0001C4FEA /* Reflect (iOS) */, + B1DB9E6543DE4A009DB00916 /* Reflect Watch App */, + 1CD90B44278C7E7A001C4FEA /* ReflectWidgetExtension */, + 1CD90AFA278C7DE0001C4FEA /* Reflect (macOS) */, 1CD90B01278C7DE0001C4FEA /* Tests iOS */, 1CD90B0D278C7DE0001C4FEA /* Tests macOS */, - B375A511826E3AB53E2CF51A /* FeelsTests */, + B375A511826E3AB53E2CF51A /* ReflectTests */, ); }; /* End PBXProject section */ @@ -765,7 +733,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 1C0DAB51279DB0FB003B1F21 /* Localizable.xcstrings in Resources */, + 1C0DAB51279DB0FB003B1F21 /* Reflect/Localizable.xcstrings in Resources */, 1CDEFBBF2F3B8736006AE6A1 /* Configuration.storekit in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -796,7 +764,7 @@ buildActionMask = 2147483647; files = ( 1CDEFBC02F3B8736006AE6A1 /* Configuration.storekit in Resources */, - 1C0DAB52279DB0FB003B1F22 /* Localizable.xcstrings in Resources */, + 1C0DAB52279DB0FB003B1F22 /* Reflect/Localizable.xcstrings in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -931,23 +899,23 @@ /* Begin PBXTargetDependency section */ 1CD90B04278C7DE0001C4FEA /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = 1CD90AF4278C7DE0001C4FEA /* Feels (iOS) */; + target = 1CD90AF4278C7DE0001C4FEA /* Reflect (iOS) */; targetProxy = 1CD90B03278C7DE0001C4FEA /* PBXContainerItemProxy */; }; 1CD90B10278C7DE0001C4FEA /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = 1CD90AFA278C7DE0001C4FEA /* Feels (macOS) */; + target = 1CD90AFA278C7DE0001C4FEA /* Reflect (macOS) */; targetProxy = 1CD90B0F278C7DE0001C4FEA /* PBXContainerItemProxy */; }; 1CD90B55278C7E7A001C4FEA /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = 1CD90B44278C7E7A001C4FEA /* FeelsWidgetExtension */; + target = 1CD90B44278C7E7A001C4FEA /* ReflectWidgetExtension */; targetProxy = 1CD90B54278C7E7A001C4FEA /* PBXContainerItemProxy */; }; 946F2D1B29B91CD7DB732908 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = "Feels (iOS)"; - target = 1CD90AF4278C7DE0001C4FEA /* Feels (iOS) */; + name = "Reflect (iOS)"; + target = 1CD90AF4278C7DE0001C4FEA /* Reflect (iOS) */; targetProxy = A0B973C7674930232515563A /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ @@ -958,22 +926,22 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - CODE_SIGN_ENTITLEMENTS = "Feels Watch App/Feels Watch AppDebug.entitlements"; + CODE_SIGN_ENTITLEMENTS = "Reflect Watch App/Reflect Watch AppDebug.entitlements"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 23; DEVELOPMENT_TEAM = QND55P4443; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_KEY_CFBundleDisplayName = Feels; + INFOPLIST_KEY_CFBundleDisplayName = Reflect; INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; - INFOPLIST_KEY_WKCompanionAppBundleIdentifier = com.88oakapps.feels.debug; + INFOPLIST_KEY_WKCompanionAppBundleIdentifier = com.88oakapps.reflect.debug; INFOPLIST_KEY_WKRunsIndependentlyOfCompanionApp = NO; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); MARKETING_VERSION = 1.0.2; - PRODUCT_BUNDLE_IDENTIFIER = com.88oakapps.feels.debug.watch; + PRODUCT_BUNDLE_IDENTIFIER = com.88oakapps.reflect.debug.watch; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = watchos; SKIP_INSTALL = YES; @@ -1113,20 +1081,20 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES; - CODE_SIGN_ENTITLEMENTS = "Feels (iOS)Dev.entitlements"; + CODE_SIGN_ENTITLEMENTS = "Reflect (iOS)Dev.entitlements"; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 23; DEVELOPMENT_TEAM = QND55P4443; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = "Feels--iOS--Info.plist"; + INFOPLIST_FILE = "Reflect--iOS--Info.plist"; INFOPLIST_KEY_ITSAppUsesNonExemptEncryption = NO; - INFOPLIST_KEY_NSCameraUsageDescription = "Feels uses the camera to take photos for your mood journal entries."; - INFOPLIST_KEY_NSFaceIDUsageDescription = "Feels uses Face ID to protect your private mood data."; - INFOPLIST_KEY_NSHealthShareUsageDescription = "Feels uses your health data to find correlations between your activity, sleep, and mood patterns to provide personalized insights."; - INFOPLIST_KEY_NSHealthUpdateUsageDescription = "Feels syncs your mood data to Apple Health so you can see how your emotions correlate with sleep, exercise, and other health metrics."; - INFOPLIST_KEY_NSPhotoLibraryUsageDescription = "Feels accesses your photo library to attach photos to your mood journal entries."; + INFOPLIST_KEY_NSCameraUsageDescription = "Reflect uses the camera to take photos for your mood journal entries."; + INFOPLIST_KEY_NSFaceIDUsageDescription = "Reflect uses Face ID to protect your private mood data."; + INFOPLIST_KEY_NSHealthShareUsageDescription = "Reflect uses your health data to find correlations between your activity, sleep, and mood patterns to provide personalized insights."; + INFOPLIST_KEY_NSHealthUpdateUsageDescription = "Reflect syncs your mood data to Apple Health so you can see how your emotions correlate with sleep, exercise, and other health metrics."; + INFOPLIST_KEY_NSPhotoLibraryUsageDescription = "Reflect accesses your photo library to attach photos to your mood journal entries."; INFOPLIST_KEY_NSSupportsLiveActivities = YES; INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; @@ -1139,8 +1107,8 @@ "@executable_path/Frameworks", ); MARKETING_VERSION = 1.0.2; - PRODUCT_BUNDLE_IDENTIFIER = com.88oakapps.feels.debug; - PRODUCT_NAME = Feels; + PRODUCT_BUNDLE_IDENTIFIER = com.88oakapps.reflect.debug; + PRODUCT_NAME = Reflect; PROVISIONING_PROFILE_SPECIFIER = ""; SDKROOT = iphoneos; SWIFT_EMIT_LOC_STRINGS = YES; @@ -1155,20 +1123,20 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES; - CODE_SIGN_ENTITLEMENTS = "Feels (iOS).entitlements"; + CODE_SIGN_ENTITLEMENTS = "Reflect (iOS).entitlements"; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 23; DEVELOPMENT_TEAM = QND55P4443; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = "Feels--iOS--Info.plist"; + INFOPLIST_FILE = "Reflect--iOS--Info.plist"; INFOPLIST_KEY_ITSAppUsesNonExemptEncryption = NO; - INFOPLIST_KEY_NSCameraUsageDescription = "Feels uses the camera to take photos for your mood journal entries."; - INFOPLIST_KEY_NSFaceIDUsageDescription = "Feels uses Face ID to protect your private mood data."; - INFOPLIST_KEY_NSHealthShareUsageDescription = "Feels uses your health data to find correlations between your activity, sleep, and mood patterns to provide personalized insights."; - INFOPLIST_KEY_NSHealthUpdateUsageDescription = "Feels syncs your mood data to Apple Health so you can see how your emotions correlate with sleep, exercise, and other health metrics."; - INFOPLIST_KEY_NSPhotoLibraryUsageDescription = "Feels accesses your photo library to attach photos to your mood journal entries."; + INFOPLIST_KEY_NSCameraUsageDescription = "Reflect uses the camera to take photos for your mood journal entries."; + INFOPLIST_KEY_NSFaceIDUsageDescription = "Reflect uses Face ID to protect your private mood data."; + INFOPLIST_KEY_NSHealthShareUsageDescription = "Reflect uses your health data to find correlations between your activity, sleep, and mood patterns to provide personalized insights."; + INFOPLIST_KEY_NSHealthUpdateUsageDescription = "Reflect syncs your mood data to Apple Health so you can see how your emotions correlate with sleep, exercise, and other health metrics."; + INFOPLIST_KEY_NSPhotoLibraryUsageDescription = "Reflect accesses your photo library to attach photos to your mood journal entries."; INFOPLIST_KEY_NSSupportsLiveActivities = YES; INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; @@ -1181,8 +1149,8 @@ "@executable_path/Frameworks", ); MARKETING_VERSION = 1.0.2; - PRODUCT_BUNDLE_IDENTIFIER = com.88oakapps.feels; - PRODUCT_NAME = Feels; + PRODUCT_BUNDLE_IDENTIFIER = com.88oakapps.reflect; + PRODUCT_NAME = Reflect; PROVISIONING_PROFILE_SPECIFIER = ""; SDKROOT = iphoneos; SWIFT_EMIT_LOC_STRINGS = YES; @@ -1215,8 +1183,8 @@ ); MACOSX_DEPLOYMENT_TARGET = 12.1; MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.88oakapps.feels; - PRODUCT_NAME = Feels; + PRODUCT_BUNDLE_IDENTIFIER = com.88oakapps.reflect; + PRODUCT_NAME = Reflect; SDKROOT = macosx; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_VERSION = 5.0; @@ -1246,8 +1214,8 @@ ); MACOSX_DEPLOYMENT_TARGET = 12.1; MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.88oakapps.feels.debug; - PRODUCT_NAME = Feels; + PRODUCT_BUNDLE_IDENTIFIER = com.88oakapps.reflect.debug; + PRODUCT_NAME = Reflect; SDKROOT = macosx; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_VERSION = 5.0; @@ -1268,7 +1236,7 @@ SWIFT_EMIT_LOC_STRINGS = NO; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; - TEST_TARGET_NAME = "Feels (iOS)"; + TEST_TARGET_NAME = "Reflect (iOS)"; }; name = Debug; }; @@ -1286,7 +1254,7 @@ SWIFT_EMIT_LOC_STRINGS = NO; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; - TEST_TARGET_NAME = "Feels (iOS)"; + TEST_TARGET_NAME = "Reflect (iOS)"; VALIDATE_PRODUCT = YES; }; name = Release; @@ -1305,7 +1273,7 @@ SDKROOT = macosx; SWIFT_EMIT_LOC_STRINGS = NO; SWIFT_VERSION = 5.0; - TEST_TARGET_NAME = "Feels (macOS)"; + TEST_TARGET_NAME = "Reflect (macOS)"; }; name = Debug; }; @@ -1323,7 +1291,7 @@ SDKROOT = macosx; SWIFT_EMIT_LOC_STRINGS = NO; SWIFT_VERSION = 5.0; - TEST_TARGET_NAME = "Feels (macOS)"; + TEST_TARGET_NAME = "Reflect (macOS)"; }; name = Release; }; @@ -1332,14 +1300,14 @@ buildSettings = { ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; - CODE_SIGN_ENTITLEMENTS = FeelsWidgetExtensionDev.entitlements; + CODE_SIGN_ENTITLEMENTS = ReflectWidgetExtensionDev.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 23; DEVELOPMENT_TEAM = QND55P4443; GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = "FeelsWidgetExtension-Info.plist"; - INFOPLIST_KEY_CFBundleDisplayName = FeelsWidget; + INFOPLIST_FILE = "ReflectWidgetExtension-Info.plist"; + INFOPLIST_KEY_CFBundleDisplayName = ReflectWidget; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INFOPLIST_KEY_NSSupportsLiveActivities = YES; IPHONEOS_DEPLOYMENT_TARGET = 18.6; @@ -1349,7 +1317,7 @@ "@executable_path/../../Frameworks", ); MARKETING_VERSION = 1.0.2; - PRODUCT_BUNDLE_IDENTIFIER = com.88oakapps.feels.debug.widget; + PRODUCT_BUNDLE_IDENTIFIER = com.88oakapps.reflect.debug.widget; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SDKROOT = iphoneos; @@ -1366,14 +1334,14 @@ buildSettings = { ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; - CODE_SIGN_ENTITLEMENTS = FeelsWidgetExtension.entitlements; + CODE_SIGN_ENTITLEMENTS = ReflectWidgetExtension.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 23; DEVELOPMENT_TEAM = QND55P4443; GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = "FeelsWidgetExtension-Info.plist"; - INFOPLIST_KEY_CFBundleDisplayName = FeelsWidget; + INFOPLIST_FILE = "ReflectWidgetExtension-Info.plist"; + INFOPLIST_KEY_CFBundleDisplayName = ReflectWidget; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INFOPLIST_KEY_NSSupportsLiveActivities = YES; IPHONEOS_DEPLOYMENT_TARGET = 18.6; @@ -1383,7 +1351,7 @@ "@executable_path/../../Frameworks", ); MARKETING_VERSION = 1.0.2; - PRODUCT_BUNDLE_IDENTIFIER = com.88oakapps.feels.widget; + PRODUCT_BUNDLE_IDENTIFIER = com.88oakapps.reflect.widget; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SDKROOT = iphoneos; @@ -1404,13 +1372,13 @@ DEVELOPMENT_TEAM = QND55P4443; GENERATE_INFOPLIST_FILE = YES; IPHONEOS_DEPLOYMENT_TARGET = 18.0; - PRODUCT_BUNDLE_IDENTIFIER = com.88oakapps.feels.tests; + PRODUCT_BUNDLE_IDENTIFIER = com.88oakapps.reflect.tests; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; SWIFT_EMIT_LOC_STRINGS = NO; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Feels.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Feels"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Reflect.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Reflect"; }; name = Debug; }; @@ -1419,22 +1387,22 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - CODE_SIGN_ENTITLEMENTS = "Feels Watch App/Feels Watch App.entitlements"; + CODE_SIGN_ENTITLEMENTS = "Reflect Watch App/Reflect Watch App.entitlements"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 23; DEVELOPMENT_TEAM = QND55P4443; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_KEY_CFBundleDisplayName = Feels; + INFOPLIST_KEY_CFBundleDisplayName = Reflect; INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; - INFOPLIST_KEY_WKCompanionAppBundleIdentifier = com.88oakapps.feels; + INFOPLIST_KEY_WKCompanionAppBundleIdentifier = com.88oakapps.reflect; INFOPLIST_KEY_WKRunsIndependentlyOfCompanionApp = NO; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); MARKETING_VERSION = 1.0.2; - PRODUCT_BUNDLE_IDENTIFIER = com.88oakapps.feels.watch; + PRODUCT_BUNDLE_IDENTIFIER = com.88oakapps.reflect.watch; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = watchos; SKIP_INSTALL = YES; @@ -1454,13 +1422,13 @@ DEVELOPMENT_TEAM = QND55P4443; GENERATE_INFOPLIST_FILE = YES; IPHONEOS_DEPLOYMENT_TARGET = 18.0; - PRODUCT_BUNDLE_IDENTIFIER = com.88oakapps.feels.tests; + PRODUCT_BUNDLE_IDENTIFIER = com.88oakapps.reflect.tests; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; SWIFT_EMIT_LOC_STRINGS = NO; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Feels.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Feels"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Reflect.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Reflect"; VALIDATE_PRODUCT = YES; }; name = Release; @@ -1468,7 +1436,7 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 1B7D3790BF564C5392D480B2 /* Build configuration list for PBXNativeTarget "Feels Watch App" */ = { + 1B7D3790BF564C5392D480B2 /* Build configuration list for PBXNativeTarget "Reflect Watch App" */ = { isa = XCConfigurationList; buildConfigurations = ( 1AA0E790DCE44476924A23BB /* Debug */, @@ -1477,7 +1445,7 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 1CD90AE9278C7DDF001C4FEA /* Build configuration list for PBXProject "Feels" */ = { + 1CD90AE9278C7DDF001C4FEA /* Build configuration list for PBXProject "Reflect" */ = { isa = XCConfigurationList; buildConfigurations = ( 1CD90B20278C7DE0001C4FEA /* Debug */, @@ -1486,7 +1454,7 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 1CD90B22278C7DE0001C4FEA /* Build configuration list for PBXNativeTarget "Feels (iOS)" */ = { + 1CD90B22278C7DE0001C4FEA /* Build configuration list for PBXNativeTarget "Reflect (iOS)" */ = { isa = XCConfigurationList; buildConfigurations = ( 1CD90B23278C7DE0001C4FEA /* Debug */, @@ -1495,7 +1463,7 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 1CD90B25278C7DE0001C4FEA /* Build configuration list for PBXNativeTarget "Feels (macOS)" */ = { + 1CD90B25278C7DE0001C4FEA /* Build configuration list for PBXNativeTarget "Reflect (macOS)" */ = { isa = XCConfigurationList; buildConfigurations = ( 1CD90B26278C7DE0001C4FEA /* Debug */, @@ -1522,7 +1490,7 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 1CD90B57278C7E7A001C4FEA /* Build configuration list for PBXNativeTarget "FeelsWidgetExtension" */ = { + 1CD90B57278C7E7A001C4FEA /* Build configuration list for PBXNativeTarget "ReflectWidgetExtension" */ = { isa = XCConfigurationList; buildConfigurations = ( 1CD90B58278C7E7A001C4FEA /* Debug */, @@ -1531,7 +1499,7 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 611E0B1E1241C11626465A8D /* Build configuration list for PBXNativeTarget "FeelsTests" */ = { + 611E0B1E1241C11626465A8D /* Build configuration list for PBXNativeTarget "ReflectTests" */ = { isa = XCConfigurationList; buildConfigurations = ( C9B28244C1A36D4F2FE7E61A /* Release */, diff --git a/Feels.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Reflect.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 100% rename from Feels.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to Reflect.xcodeproj/project.xcworkspace/contents.xcworkspacedata diff --git a/Feels.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Reflect.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from Feels.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to Reflect.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/Feels.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/Reflect.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings similarity index 100% rename from Feels.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings rename to Reflect.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings diff --git a/Feels.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Reflect.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved similarity index 100% rename from Feels.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved rename to Reflect.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved diff --git a/Feels.xcodeproj/xcshareddata/xcschemes/Feels (iOS).xcscheme b/Reflect.xcodeproj/xcshareddata/xcschemes/Reflect (iOS).xcscheme similarity index 81% rename from Feels.xcodeproj/xcshareddata/xcschemes/Feels (iOS).xcscheme rename to Reflect.xcodeproj/xcshareddata/xcschemes/Reflect (iOS).xcscheme index a172623..d2cad85 100644 --- a/Feels.xcodeproj/xcshareddata/xcschemes/Feels (iOS).xcscheme +++ b/Reflect.xcodeproj/xcshareddata/xcschemes/Reflect (iOS).xcscheme @@ -15,9 +15,9 @@ + BuildableName = "Reflect.app" + BlueprintName = "Reflect (iOS)" + ReferencedContainer = "container:Reflect.xcodeproj"> @@ -33,9 +33,9 @@ + BuildableName = "ReflectTests.xctest" + BlueprintName = "ReflectTests" + ReferencedContainer = "container:Reflect.xcodeproj"> + ReferencedContainer = "container:Reflect.xcodeproj"> @@ -65,9 +65,9 @@ + BuildableName = "Reflect.app" + BlueprintName = "Reflect (iOS)" + ReferencedContainer = "container:Reflect.xcodeproj"> + BuildableName = "Reflect.app" + BlueprintName = "Reflect (iOS)" + ReferencedContainer = "container:Reflect.xcodeproj"> diff --git a/Feels.xcodeproj/xcshareddata/xcschemes/FeelsWidgetExtension.xcscheme b/Reflect.xcodeproj/xcshareddata/xcschemes/ReflectWidgetExtension.xcscheme similarity index 81% rename from Feels.xcodeproj/xcshareddata/xcschemes/FeelsWidgetExtension.xcscheme rename to Reflect.xcodeproj/xcshareddata/xcschemes/ReflectWidgetExtension.xcscheme index b4c824c..c4f82a9 100644 --- a/Feels.xcodeproj/xcshareddata/xcschemes/FeelsWidgetExtension.xcscheme +++ b/Reflect.xcodeproj/xcshareddata/xcschemes/ReflectWidgetExtension.xcscheme @@ -16,9 +16,9 @@ + BuildableName = "ReflectWidgetExtension.appex" + BlueprintName = "ReflectWidgetExtension" + ReferencedContainer = "container:Reflect.xcodeproj"> + BuildableName = "Reflect.app" + BlueprintName = "Reflect (iOS)" + ReferencedContainer = "container:Reflect.xcodeproj"> @@ -63,24 +63,24 @@ + BuildableName = "ReflectWidgetExtension.appex" + BlueprintName = "ReflectWidgetExtension" + ReferencedContainer = "container:Reflect.xcodeproj"> + BuildableName = "Reflect.app" + BlueprintName = "Reflect (iOS)" + ReferencedContainer = "container:Reflect.xcodeproj"> + BuildableName = "Reflect.app" + BlueprintName = "Reflect (iOS)" + ReferencedContainer = "container:Reflect.xcodeproj"> diff --git a/Feels/Localizable.xcstrings b/Reflect/Localizable.xcstrings similarity index 98% rename from Feels/Localizable.xcstrings rename to Reflect/Localizable.xcstrings index 048a1e6..09e8ead 100644 --- a/Feels/Localizable.xcstrings +++ b/Reflect/Localizable.xcstrings @@ -8169,170 +8169,170 @@ } } }, - "Feels": { + "Reflect": { "comment": "The name of the widget.", "isCommentAutoGenerated": true, "localizations": { "de": { "stringUnit": { "state": "translated", - "value": "Feels" + "value": "Reflect" } }, "es": { "stringUnit": { "state": "translated", - "value": "Feels" + "value": "Reflect" } }, "fr": { "stringUnit": { "state": "translated", - "value": "Feels" + "value": "Reflect" } }, "ja": { "stringUnit": { "state": "translated", - "value": "Feels" + "value": "Reflect" } }, "ko": { "stringUnit": { "state": "translated", - "value": "Feels" + "value": "Reflect" } }, "pt-BR": { "stringUnit": { "state": "translated", - "value": "Feels" + "value": "Reflect" } } } }, - "FEELS": { + "REFLECT": { "comment": "The name of the app.", "isCommentAutoGenerated": true, "localizations": { "de": { "stringUnit": { "state": "translated", - "value": "FEELS" + "value": "REFLECT" } }, "es": { "stringUnit": { "state": "translated", - "value": "FEELS" + "value": "REFLECT" } }, "fr": { "stringUnit": { "state": "translated", - "value": "FEELS" + "value": "REFLECT" } }, "ja": { "stringUnit": { "state": "translated", - "value": "FEELS" + "value": "REFLECT" } }, "ko": { "stringUnit": { "state": "translated", - "value": "FEELS" + "value": "REFLECT" } }, "pt-BR": { "stringUnit": { "state": "translated", - "value": "FEELS" + "value": "REFLECT" } } } }, - "Feels Icon": { + "Reflect Icon": { "comment": "Name of the widget configuration.", "isCommentAutoGenerated": true, "localizations": { "de": { "stringUnit": { "state": "translated", - "value": "Feels-Symbol" + "value": "Reflect-Symbol" } }, "es": { "stringUnit": { "state": "translated", - "value": "Icono de Feels" + "value": "Icono de Reflect" } }, "fr": { "stringUnit": { "state": "translated", - "value": "Icône Feels" + "value": "Icône Reflect" } }, "ja": { "stringUnit": { "state": "translated", - "value": "Feelsアイコン" + "value": "Reflectアイコン" } }, "ko": { "stringUnit": { "state": "translated", - "value": "Feels 아이콘" + "value": "Reflect 아이콘" } }, "pt-BR": { "stringUnit": { "state": "translated", - "value": "Ícone do Feels" + "value": "Ícone do Reflect" } } } }, - "FEELS MIXTAPE": { + "REFLECT MIXTAPE": { "comment": "The name of the premium subscription experience.", "isCommentAutoGenerated": true, "localizations": { "de": { "stringUnit": { "state": "translated", - "value": "FEELS MIXTAPE" + "value": "REFLECT MIXTAPE" } }, "es": { "stringUnit": { "state": "translated", - "value": "FEELS MIXTAPE" + "value": "REFLECT MIXTAPE" } }, "fr": { "stringUnit": { "state": "translated", - "value": "FEELS MIXTAPE" + "value": "REFLECT MIXTAPE" } }, "ja": { "stringUnit": { "state": "translated", - "value": "FEELS MIXTAPE" + "value": "REFLECT MIXTAPE" } }, "ko": { "stringUnit": { "state": "translated", - "value": "FEELS MIXTAPE" + "value": "REFLECT MIXTAPE" } }, "pt-BR": { "stringUnit": { "state": "translated", - "value": "FEELS MIXTAPE" + "value": "REFLECT MIXTAPE" } } } @@ -8921,44 +8921,44 @@ } } }, - "Help improve Feels by sharing anonymous usage data": { + "Help improve Reflect by sharing anonymous usage data": { "comment": "A description of the analytics toggle.", "isCommentAutoGenerated": true, "localizations": { "de": { "stringUnit": { "state": "translated", - "value": "Hilf Feels zu verbessern, indem du anonyme Nutzungsdaten teilst" + "value": "Hilf Reflect zu verbessern, indem du anonyme Nutzungsdaten teilst" } }, "es": { "stringUnit": { "state": "translated", - "value": "Ayuda a mejorar Feels compartiendo datos de uso anónimos" + "value": "Ayuda a mejorar Reflect compartiendo datos de uso anónimos" } }, "fr": { "stringUnit": { "state": "translated", - "value": "Aidez à améliorer Feels en partageant des données d'utilisation anonymes" + "value": "Aidez à améliorer Reflect en partageant des données d'utilisation anonymes" } }, "ja": { "stringUnit": { "state": "translated", - "value": "匿名の使用データを共有してFeelsの改善に協力" + "value": "匿名の使用データを共有してReflectの改善に協力" } }, "ko": { "stringUnit": { "state": "translated", - "value": "익명 사용 데이터를 공유하여 Feels 개선에 도움을 주세요" + "value": "익명 사용 데이터를 공유하여 Reflect 개선에 도움을 주세요" } }, "pt-BR": { "stringUnit": { "state": "translated", - "value": "Ajude a melhorar o Feels compartilhando dados de uso anônimos" + "value": "Ajude a melhorar o Reflect compartilhando dados de uso anônimos" } } } @@ -9891,7 +9891,7 @@ } }, "Log Mood": { - "comment": "A button that opens Feels to log a mood.", + "comment": "A button that opens Reflect to log a mood.", "isCommentAutoGenerated": true, "localizations": { "de": { @@ -12212,128 +12212,128 @@ } } }, - "Open Feels": { - "comment": "Title of the app intent to open the Feels app.", + "Open Reflect": { + "comment": "Title of the app intent to open the Reflect app.", "isCommentAutoGenerated": true, "localizations": { "de": { "stringUnit": { "state": "translated", - "value": "Feels öffnen" + "value": "Reflect öffnen" } }, "es": { "stringUnit": { "state": "translated", - "value": "Abrir Feels" + "value": "Abrir Reflect" } }, "fr": { "stringUnit": { "state": "translated", - "value": "Ouvrir Feels" + "value": "Ouvrir Reflect" } }, "ja": { "stringUnit": { "state": "translated", - "value": "Feelsを開く" + "value": "Reflectを開く" } }, "ko": { "stringUnit": { "state": "translated", - "value": "Feels 열기" + "value": "Reflect 열기" } }, "pt-BR": { "stringUnit": { "state": "translated", - "value": "Abrir Feels" + "value": "Abrir Reflect" } } } }, - "Open Feels to log your mood": { + "Open Reflect to log your mood": { "comment": "Description of the \"Log Mood\" control widget.", "isCommentAutoGenerated": true, "localizations": { "de": { "stringUnit": { "state": "translated", - "value": "Öffne Feels, um deine Stimmung zu erfassen" + "value": "Öffne Reflect, um deine Stimmung zu erfassen" } }, "es": { "stringUnit": { "state": "translated", - "value": "Abre Feels para registrar tu estado de ánimo" + "value": "Abre Reflect para registrar tu estado de ánimo" } }, "fr": { "stringUnit": { "state": "translated", - "value": "Ouvre Feels pour enregistrer ton humeur" + "value": "Ouvre Reflect pour enregistrer ton humeur" } }, "ja": { "stringUnit": { "state": "translated", - "value": "Feelsを開いて気分を記録しよう" + "value": "Reflectを開いて気分を記録しよう" } }, "ko": { "stringUnit": { "state": "translated", - "value": "Feels를 열어 기분을 기록하세요" + "value": "Reflect를 열어 기분을 기록하세요" } }, "pt-BR": { "stringUnit": { "state": "translated", - "value": "Abra o Feels para registrar seu humor" + "value": "Abra o Reflect para registrar seu humor" } } } }, - "Open the Feels app to log your mood": { - "comment": "A user-visible description of the intent to open the Feels app to log your mood.", + "Open the Reflect app to log your mood": { + "comment": "A user-visible description of the intent to open the Reflect app to log your mood.", "isCommentAutoGenerated": true, "localizations": { "de": { "stringUnit": { "state": "translated", - "value": "Öffne die Feels-App, um deine Stimmung zu erfassen" + "value": "Öffne die Reflect-App, um deine Stimmung zu erfassen" } }, "es": { "stringUnit": { "state": "translated", - "value": "Abre la app Feels para registrar tu estado de ánimo" + "value": "Abre la app Reflect para registrar tu estado de ánimo" } }, "fr": { "stringUnit": { "state": "translated", - "value": "Ouvre l'app Feels pour enregistrer ton humeur" + "value": "Ouvre l'app Reflect pour enregistrer ton humeur" } }, "ja": { "stringUnit": { "state": "translated", - "value": "Feelsアプリを開いて気分を記録しよう" + "value": "Reflectアプリを開いて気分を記録しよう" } }, "ko": { "stringUnit": { "state": "translated", - "value": "Feels 앱을 열어 기분을 기록하세요" + "value": "Reflect 앱을 열어 기분을 기록하세요" } }, "pt-BR": { "stringUnit": { "state": "translated", - "value": "Abra o app Feels para registrar seu humor" + "value": "Abra o app Reflect para registrar seu humor" } } } @@ -13520,43 +13520,43 @@ "de": { "stringUnit": { "state": "translated", - "value": "Ein iFeels-Abo gibt dir Zugang zu all deinen historischen Daten und den Monats- und Jahresdiagrammen." + "value": "Ein iReflect-Abo gibt dir Zugang zu all deinen historischen Daten und den Monats- und Jahresdiagrammen." } }, "en": { "stringUnit": { "state": "translated", - "value": "An iFeels subscription gives you access to all of your historical data, and both Month and Year charts." + "value": "An iReflect subscription gives you access to all of your historical data, and both Month and Year charts." } }, "es": { "stringUnit": { "state": "translated", - "value": "Una suscripción a iFeels te da acceso a todos tus datos históricos, y a los gráficos de Mes y Año." + "value": "Una suscripción a iReflect te da acceso a todos tus datos históricos, y a los gráficos de Mes y Año." } }, "fr": { "stringUnit": { "state": "translated", - "value": "Un abonnement iFeels vous donne accès à toutes vos données historiques, ainsi qu'aux graphiques Mois et Année." + "value": "Un abonnement iReflect vous donne accès à toutes vos données historiques, ainsi qu'aux graphiques Mois et Année." } }, "ja": { "stringUnit": { "state": "translated", - "value": "iFeelsサブスクリプションで、すべての過去データと月・年チャートにアクセスできます。" + "value": "iReflectサブスクリプションで、すべての過去データと月・年チャートにアクセスできます。" } }, "ko": { "stringUnit": { "state": "translated", - "value": "iFeels 구독으로 모든 과거 데이터와 월별, 연도별 차트에 액세스할 수 있습니다." + "value": "iReflect 구독으로 모든 과거 데이터와 월별, 연도별 차트에 액세스할 수 있습니다." } }, "pt-BR": { "stringUnit": { "state": "translated", - "value": "Uma assinatura iFeels dá acesso a todos os seus dados históricos e aos gráficos de Mês e Ano." + "value": "Uma assinatura iReflect dá acesso a todos os seus dados históricos e aos gráficos de Mês e Ano." } } } @@ -13974,44 +13974,44 @@ } } }, - "Record your mood for today in Feels": { + "Record your mood for today in Reflect": { "comment": "Title of the \"Log Mood\" app intent.", "isCommentAutoGenerated": true, "localizations": { "de": { "stringUnit": { "state": "translated", - "value": "Erfasse deine Stimmung für heute in Feels" + "value": "Erfasse deine Stimmung für heute in Reflect" } }, "es": { "stringUnit": { "state": "translated", - "value": "Registra tu estado de ánimo de hoy en Feels" + "value": "Registra tu estado de ánimo de hoy en Reflect" } }, "fr": { "stringUnit": { "state": "translated", - "value": "Enregistre ton humeur du jour dans Feels" + "value": "Enregistre ton humeur du jour dans Reflect" } }, "ja": { "stringUnit": { "state": "translated", - "value": "Feelsで今日の気分を記録" + "value": "Reflectで今日の気分を記録" } }, "ko": { "stringUnit": { "state": "translated", - "value": "Feels에서 오늘의 기분을 기록하세요" + "value": "Reflect에서 오늘의 기분을 기록하세요" } }, "pt-BR": { "stringUnit": { "state": "translated", - "value": "Registre seu humor de hoje no Feels" + "value": "Registre seu humor de hoje no Reflect" } } } @@ -15247,44 +15247,44 @@ } } }, - "See what mood you logged today in Feels": { + "See what mood you logged today in Reflect": { "comment": "Title of an intent that allows the user to check their logged mood for the current day.", "isCommentAutoGenerated": true, "localizations": { "de": { "stringUnit": { "state": "translated", - "value": "Sieh dir an, welche Stimmung du heute in Feels erfasst hast" + "value": "Sieh dir an, welche Stimmung du heute in Reflect erfasst hast" } }, "es": { "stringUnit": { "state": "translated", - "value": "Mira qué estado de ánimo registraste hoy en Feels" + "value": "Mira qué estado de ánimo registraste hoy en Reflect" } }, "fr": { "stringUnit": { "state": "translated", - "value": "Vois quelle humeur tu as enregistrée aujourd'hui dans Feels" + "value": "Vois quelle humeur tu as enregistrée aujourd'hui dans Reflect" } }, "ja": { "stringUnit": { "state": "translated", - "value": "Feelsで今日記録した気分を確認" + "value": "Reflectで今日記録した気分を確認" } }, "ko": { "stringUnit": { "state": "translated", - "value": "Feels에서 오늘 기록한 기분 확인" + "value": "Reflect에서 오늘 기록한 기분 확인" } }, "pt-BR": { "stringUnit": { "state": "translated", - "value": "Veja qual humor você registrou hoje no Feels" + "value": "Veja qual humor você registrou hoje no Reflect" } } } @@ -15909,43 +15909,43 @@ "de": { "stringUnit": { "state": "translated", - "value": "Die Hintergrundaktualisierung ermöglicht es iFeels, dir rechtzeitig Benachrichtigungen zu senden, auch wenn die App nicht geöffnet ist. So verpasst du nie deinen täglichen Stimmungs-Check-in." + "value": "Die Hintergrundaktualisierung ermöglicht es iReflect, dir rechtzeitig Benachrichtigungen zu senden, auch wenn die App nicht geöffnet ist. So verpasst du nie deinen täglichen Stimmungs-Check-in." } }, "en": { "stringUnit": { "state": "translated", - "value": "Background App Refresh allows iFeels to send you timely notifications even when the app isn't open. This ensures you never miss your daily mood check-in." + "value": "Background App Refresh allows iReflect to send you timely notifications even when the app isn't open. This ensures you never miss your daily mood check-in." } }, "es": { "stringUnit": { "state": "translated", - "value": "La actualización en segundo plano permite que iFeels te envíe notificaciones oportunas incluso cuando la app no está abierta. Esto asegura que nunca te pierdas tu registro diario de estado de ánimo." + "value": "La actualización en segundo plano permite que iReflect te envíe notificaciones oportunas incluso cuando la app no está abierta. Esto asegura que nunca te pierdas tu registro diario de estado de ánimo." } }, "fr": { "stringUnit": { "state": "translated", - "value": "L'actualisation en arrière-plan permet à iFeels de t'envoyer des notifications à temps même lorsque l'app n'est pas ouverte. Cela garantit que tu ne manques jamais ton enregistrement quotidien d'humeur." + "value": "L'actualisation en arrière-plan permet à iReflect de t'envoyer des notifications à temps même lorsque l'app n'est pas ouverte. Cela garantit que tu ne manques jamais ton enregistrement quotidien d'humeur." } }, "ja": { "stringUnit": { "state": "translated", - "value": "バックグラウンド更新により、アプリを開いていなくてもiFeelsからタイムリーな通知を受け取れます。毎日の気分チェックインを見逃すことがありません。" + "value": "バックグラウンド更新により、アプリを開いていなくてもiReflectからタイムリーな通知を受け取れます。毎日の気分チェックインを見逃すことがありません。" } }, "ko": { "stringUnit": { "state": "translated", - "value": "백그라운드 앱 새로고침을 사용하면 앱이 열려 있지 않아도 iFeels에서 적시에 알림을 보낼 수 있습니다. 이를 통해 매일 기분 체크인을 놓치지 않습니다." + "value": "백그라운드 앱 새로고침을 사용하면 앱이 열려 있지 않아도 iReflect에서 적시에 알림을 보낼 수 있습니다. 이를 통해 매일 기분 체크인을 놓치지 않습니다." } }, "pt-BR": { "stringUnit": { "state": "translated", - "value": "A atualização em segundo plano permite que o iFeels envie notificações no momento certo, mesmo quando o app não está aberto. Isso garante que você nunca perca seu registro diário de humor." + "value": "A atualização em segundo plano permite que o iReflect envie notificações no momento certo, mesmo quando o app não está aberto. Isso garante que você nunca perca seu registro diário de humor." } } } @@ -19425,44 +19425,44 @@ } } }, - "Welcome to Feels": { + "Welcome to Reflect": { "comment": "The title of the welcome screen in the onboarding flow.", "isCommentAutoGenerated": true, "localizations": { "de": { "stringUnit": { "state": "translated", - "value": "Willkommen bei Feels" + "value": "Willkommen bei Reflect" } }, "es": { "stringUnit": { "state": "translated", - "value": "Bienvenido a Feels" + "value": "Bienvenido a Reflect" } }, "fr": { "stringUnit": { "state": "translated", - "value": "Bienvenue dans Feels" + "value": "Bienvenue dans Reflect" } }, "ja": { "stringUnit": { "state": "translated", - "value": "Feelsへようこそ" + "value": "Reflectへようこそ" } }, "ko": { "stringUnit": { "state": "translated", - "value": "Feels에 오신 것을 환영합니다" + "value": "Reflect에 오신 것을 환영합니다" } }, "pt-BR": { "stringUnit": { "state": "translated", - "value": "Bem-vindo ao Feels" + "value": "Bem-vindo ao Reflect" } } } diff --git a/FeelsTests/DataControllerCRUDTests.swift b/ReflectTests/DataControllerCRUDTests.swift similarity index 99% rename from FeelsTests/DataControllerCRUDTests.swift rename to ReflectTests/DataControllerCRUDTests.swift index 25c0549..d5b1136 100644 --- a/FeelsTests/DataControllerCRUDTests.swift +++ b/ReflectTests/DataControllerCRUDTests.swift @@ -1,13 +1,13 @@ // // DataControllerCRUDTests.swift -// FeelsTests +// ReflectTests // // Tests for DataController create, read, update, and delete operations. // import XCTest import SwiftData -@testable import Feels +@testable import Reflect @MainActor final class DataControllerCreateTests: XCTestCase { diff --git a/FeelsTests/DayViewViewModelTests.swift b/ReflectTests/DayViewViewModelTests.swift similarity index 97% rename from FeelsTests/DayViewViewModelTests.swift rename to ReflectTests/DayViewViewModelTests.swift index 5e8de99..2101829 100644 --- a/FeelsTests/DayViewViewModelTests.swift +++ b/ReflectTests/DayViewViewModelTests.swift @@ -1,6 +1,6 @@ // // DayViewViewModelTests.swift -// FeelsTests +// ReflectTests // // Unit tests for DayViewViewModel.countEntries — verifies safe counting // across various grouped dictionary shapes (TDD for force-unwrap fix). @@ -8,7 +8,7 @@ import XCTest import SwiftData -@testable import Feels +@testable import Reflect @MainActor final class DayViewViewModelTests: XCTestCase { diff --git a/FeelsTests/IntegrationTests.swift b/ReflectTests/IntegrationTests.swift similarity index 99% rename from FeelsTests/IntegrationTests.swift rename to ReflectTests/IntegrationTests.swift index 07e284f..70ceded 100644 --- a/FeelsTests/IntegrationTests.swift +++ b/ReflectTests/IntegrationTests.swift @@ -1,13 +1,13 @@ // // IntegrationTests.swift -// FeelsTests +// ReflectTests // // Integration tests verifying full lifecycle pipelines. // import XCTest import SwiftData -@testable import Feels +@testable import Reflect @MainActor final class IntegrationTests: XCTestCase { diff --git a/FeelsTests/StreakTests.swift b/ReflectTests/StreakTests.swift similarity index 99% rename from FeelsTests/StreakTests.swift rename to ReflectTests/StreakTests.swift index dbeccda..aa76390 100644 --- a/FeelsTests/StreakTests.swift +++ b/ReflectTests/StreakTests.swift @@ -1,13 +1,13 @@ // // StreakTests.swift -// FeelsTests +// ReflectTests // // Tests for DataController streak calculation. // import XCTest import SwiftData -@testable import Feels +@testable import Reflect @MainActor final class StreakTests: XCTestCase { diff --git a/FeelsTests/VoteLogicsTests.swift b/ReflectTests/VoteLogicsTests.swift similarity index 99% rename from FeelsTests/VoteLogicsTests.swift rename to ReflectTests/VoteLogicsTests.swift index fcf2775..974da33 100644 --- a/FeelsTests/VoteLogicsTests.swift +++ b/ReflectTests/VoteLogicsTests.swift @@ -1,13 +1,13 @@ // // VoteLogicsTests.swift -// FeelsTests +// ReflectTests // // Tests for ShowBasedOnVoteLogics vote status and timing. // import XCTest import SwiftData -@testable import Feels +@testable import Reflect @MainActor final class VoteLogicsTests: XCTestCase { diff --git a/FeelsWatch WatchKit Extension/DebugInfo.plist b/ReflectWatch WatchKit Extension/DebugInfo.plist similarity index 87% rename from FeelsWatch WatchKit Extension/DebugInfo.plist rename to ReflectWatch WatchKit Extension/DebugInfo.plist index 602d4b4..f5bd62b 100644 --- a/FeelsWatch WatchKit Extension/DebugInfo.plist +++ b/ReflectWatch WatchKit Extension/DebugInfo.plist @@ -7,7 +7,7 @@ NSExtensionAttributes WKAppBundleIdentifier - com.88oak.FeelsDebug.watchkitapp + com.88oak.ReflectDebug.watchkitapp NSExtensionPointIdentifier com.apple.watchkit diff --git a/FeelsWidget2/Assets.xcassets/AccentColor.colorset/Contents.json b/ReflectWidget/Assets.xcassets/AccentColor.colorset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/AccentColor.colorset/Contents.json rename to ReflectWidget/Assets.xcassets/AccentColor.colorset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/AppIcon.appiconset/Contents.json b/ReflectWidget/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 87% rename from FeelsWidget2/Assets.xcassets/AppIcon.appiconset/Contents.json rename to ReflectWidget/Assets.xcassets/AppIcon.appiconset/Contents.json index 075f343..3e9501f 100644 --- a/FeelsWidget2/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/ReflectWidget/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "FeelsAppIcon.png", + "filename" : "ReflectAppIcon.png", "idiom" : "universal", "platform" : "ios", "size" : "1024x1024" @@ -13,7 +13,7 @@ "value" : "dark" } ], - "filename" : "FeelsAppIcon 1.png", + "filename" : "ReflectAppIcon 1.png", "idiom" : "universal", "platform" : "ios", "size" : "1024x1024" diff --git a/FeelsWidget2/Assets.xcassets/AppIcon.appiconset/FeelsAppIcon 1.png b/ReflectWidget/Assets.xcassets/AppIcon.appiconset/ReflectAppIcon 1.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/AppIcon.appiconset/FeelsAppIcon 1.png rename to ReflectWidget/Assets.xcassets/AppIcon.appiconset/ReflectAppIcon 1.png diff --git a/FeelsWidget2/Assets.xcassets/AppIcon.appiconset/FeelsAppIcon.png b/ReflectWidget/Assets.xcassets/AppIcon.appiconset/ReflectAppIcon.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/AppIcon.appiconset/FeelsAppIcon.png rename to ReflectWidget/Assets.xcassets/AppIcon.appiconset/ReflectAppIcon.png diff --git a/FeelsWidget2/Assets.xcassets/Contents.json b/ReflectWidget/Assets.xcassets/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/Contents.json rename to ReflectWidget/Assets.xcassets/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/WidgetBackground.colorset/Contents.json b/ReflectWidget/Assets.xcassets/WidgetBackground.colorset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/WidgetBackground.colorset/Contents.json rename to ReflectWidget/Assets.xcassets/WidgetBackground.colorset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/android-brands.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/android-brands.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/android-brands.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/android-brands.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/android-brands.imageset/android-brands.png b/ReflectWidget/Assets.xcassets/custom_icon/android-brands.imageset/android-brands.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/android-brands.imageset/android-brands.png rename to ReflectWidget/Assets.xcassets/custom_icon/android-brands.imageset/android-brands.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/apple-brands.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/apple-brands.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/apple-brands.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/apple-brands.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/apple-brands.imageset/apple-brands.png b/ReflectWidget/Assets.xcassets/custom_icon/apple-brands.imageset/apple-brands.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/apple-brands.imageset/apple-brands.png rename to ReflectWidget/Assets.xcassets/custom_icon/apple-brands.imageset/apple-brands.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/arrow-up-solid.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/arrow-up-solid.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/arrow-up-solid.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/arrow-up-solid.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/arrow-up-solid.imageset/arrow-up-solid.png b/ReflectWidget/Assets.xcassets/custom_icon/arrow-up-solid.imageset/arrow-up-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/arrow-up-solid.imageset/arrow-up-solid.png rename to ReflectWidget/Assets.xcassets/custom_icon/arrow-up-solid.imageset/arrow-up-solid.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/baby-solid.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/baby-solid.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/baby-solid.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/baby-solid.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/baby-solid.imageset/baby-solid.png b/ReflectWidget/Assets.xcassets/custom_icon/baby-solid.imageset/baby-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/baby-solid.imageset/baby-solid.png rename to ReflectWidget/Assets.xcassets/custom_icon/baby-solid.imageset/baby-solid.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/ban-solid.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/ban-solid.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/ban-solid.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/ban-solid.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/ban-solid.imageset/ban-solid.png b/ReflectWidget/Assets.xcassets/custom_icon/ban-solid.imageset/ban-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/ban-solid.imageset/ban-solid.png rename to ReflectWidget/Assets.xcassets/custom_icon/ban-solid.imageset/ban-solid.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/baseball-solid.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/baseball-solid.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/baseball-solid.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/baseball-solid.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/baseball-solid.imageset/baseball-solid.png b/ReflectWidget/Assets.xcassets/custom_icon/baseball-solid.imageset/baseball-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/baseball-solid.imageset/baseball-solid.png rename to ReflectWidget/Assets.xcassets/custom_icon/baseball-solid.imageset/baseball-solid.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/battery-empty-solid.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/battery-empty-solid.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/battery-empty-solid.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/battery-empty-solid.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/battery-empty-solid.imageset/battery-empty-solid.png b/ReflectWidget/Assets.xcassets/custom_icon/battery-empty-solid.imageset/battery-empty-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/battery-empty-solid.imageset/battery-empty-solid.png rename to ReflectWidget/Assets.xcassets/custom_icon/battery-empty-solid.imageset/battery-empty-solid.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/battery-full-solid.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/battery-full-solid.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/battery-full-solid.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/battery-full-solid.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/battery-full-solid.imageset/battery-full-solid.png b/ReflectWidget/Assets.xcassets/custom_icon/battery-full-solid.imageset/battery-full-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/battery-full-solid.imageset/battery-full-solid.png rename to ReflectWidget/Assets.xcassets/custom_icon/battery-full-solid.imageset/battery-full-solid.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/battery-half-solid.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/battery-half-solid.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/battery-half-solid.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/battery-half-solid.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/battery-half-solid.imageset/battery-half-solid.png b/ReflectWidget/Assets.xcassets/custom_icon/battery-half-solid.imageset/battery-half-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/battery-half-solid.imageset/battery-half-solid.png rename to ReflectWidget/Assets.xcassets/custom_icon/battery-half-solid.imageset/battery-half-solid.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/battery-quarter-solid.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/battery-quarter-solid.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/battery-quarter-solid.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/battery-quarter-solid.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/battery-quarter-solid.imageset/battery-quarter-solid.png b/ReflectWidget/Assets.xcassets/custom_icon/battery-quarter-solid.imageset/battery-quarter-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/battery-quarter-solid.imageset/battery-quarter-solid.png rename to ReflectWidget/Assets.xcassets/custom_icon/battery-quarter-solid.imageset/battery-quarter-solid.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/battery-three-quarters-solid.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/battery-three-quarters-solid.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/battery-three-quarters-solid.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/battery-three-quarters-solid.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/battery-three-quarters-solid.imageset/battery-three-quarters-solid.png b/ReflectWidget/Assets.xcassets/custom_icon/battery-three-quarters-solid.imageset/battery-three-quarters-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/battery-three-quarters-solid.imageset/battery-three-quarters-solid.png rename to ReflectWidget/Assets.xcassets/custom_icon/battery-three-quarters-solid.imageset/battery-three-quarters-solid.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/bitcoin-brands.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/bitcoin-brands.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/bitcoin-brands.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/bitcoin-brands.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/bitcoin-brands.imageset/bitcoin-brands.png b/ReflectWidget/Assets.xcassets/custom_icon/bitcoin-brands.imageset/bitcoin-brands.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/bitcoin-brands.imageset/bitcoin-brands.png rename to ReflectWidget/Assets.xcassets/custom_icon/bitcoin-brands.imageset/bitcoin-brands.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/bolt-lightning-solid.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/bolt-lightning-solid.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/bolt-lightning-solid.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/bolt-lightning-solid.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/bolt-lightning-solid.imageset/bolt-lightning-solid.png b/ReflectWidget/Assets.xcassets/custom_icon/bolt-lightning-solid.imageset/bolt-lightning-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/bolt-lightning-solid.imageset/bolt-lightning-solid.png rename to ReflectWidget/Assets.xcassets/custom_icon/bolt-lightning-solid.imageset/bolt-lightning-solid.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/bolt-solid.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/bolt-solid.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/bolt-solid.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/bolt-solid.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/bolt-solid.imageset/bolt-solid.png b/ReflectWidget/Assets.xcassets/custom_icon/bolt-solid.imageset/bolt-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/bolt-solid.imageset/bolt-solid.png rename to ReflectWidget/Assets.xcassets/custom_icon/bolt-solid.imageset/bolt-solid.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/bomb-solid.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/bomb-solid.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/bomb-solid.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/bomb-solid.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/bomb-solid.imageset/bomb-solid.png b/ReflectWidget/Assets.xcassets/custom_icon/bomb-solid.imageset/bomb-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/bomb-solid.imageset/bomb-solid.png rename to ReflectWidget/Assets.xcassets/custom_icon/bomb-solid.imageset/bomb-solid.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/btc-brands.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/btc-brands.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/btc-brands.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/btc-brands.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/btc-brands.imageset/btc-brands.png b/ReflectWidget/Assets.xcassets/custom_icon/btc-brands.imageset/btc-brands.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/btc-brands.imageset/btc-brands.png rename to ReflectWidget/Assets.xcassets/custom_icon/btc-brands.imageset/btc-brands.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/bullhorn-solid.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/bullhorn-solid.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/bullhorn-solid.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/bullhorn-solid.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/bullhorn-solid.imageset/bullhorn-solid.png b/ReflectWidget/Assets.xcassets/custom_icon/bullhorn-solid.imageset/bullhorn-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/bullhorn-solid.imageset/bullhorn-solid.png rename to ReflectWidget/Assets.xcassets/custom_icon/bullhorn-solid.imageset/bullhorn-solid.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/bullseye-solid.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/bullseye-solid.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/bullseye-solid.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/bullseye-solid.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/bullseye-solid.imageset/bullseye-solid.png b/ReflectWidget/Assets.xcassets/custom_icon/bullseye-solid.imageset/bullseye-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/bullseye-solid.imageset/bullseye-solid.png rename to ReflectWidget/Assets.xcassets/custom_icon/bullseye-solid.imageset/bullseye-solid.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/burger-solid.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/burger-solid.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/burger-solid.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/burger-solid.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/burger-solid.imageset/burger-solid.png b/ReflectWidget/Assets.xcassets/custom_icon/burger-solid.imageset/burger-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/burger-solid.imageset/burger-solid.png rename to ReflectWidget/Assets.xcassets/custom_icon/burger-solid.imageset/burger-solid.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/cannabis-solid.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/cannabis-solid.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/cannabis-solid.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/cannabis-solid.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/cannabis-solid.imageset/cannabis-solid.png b/ReflectWidget/Assets.xcassets/custom_icon/cannabis-solid.imageset/cannabis-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/cannabis-solid.imageset/cannabis-solid.png rename to ReflectWidget/Assets.xcassets/custom_icon/cannabis-solid.imageset/cannabis-solid.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/caret-down-solid.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/caret-down-solid.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/caret-down-solid.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/caret-down-solid.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/caret-down-solid.imageset/caret-down-solid.png b/ReflectWidget/Assets.xcassets/custom_icon/caret-down-solid.imageset/caret-down-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/caret-down-solid.imageset/caret-down-solid.png rename to ReflectWidget/Assets.xcassets/custom_icon/caret-down-solid.imageset/caret-down-solid.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/caret-left-solid.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/caret-left-solid.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/caret-left-solid.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/caret-left-solid.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/caret-left-solid.imageset/caret-left-solid.png b/ReflectWidget/Assets.xcassets/custom_icon/caret-left-solid.imageset/caret-left-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/caret-left-solid.imageset/caret-left-solid.png rename to ReflectWidget/Assets.xcassets/custom_icon/caret-left-solid.imageset/caret-left-solid.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/caret-right-solid.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/caret-right-solid.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/caret-right-solid.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/caret-right-solid.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/caret-right-solid.imageset/caret-right-solid.png b/ReflectWidget/Assets.xcassets/custom_icon/caret-right-solid.imageset/caret-right-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/caret-right-solid.imageset/caret-right-solid.png rename to ReflectWidget/Assets.xcassets/custom_icon/caret-right-solid.imageset/caret-right-solid.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/caret-up-solid.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/caret-up-solid.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/caret-up-solid.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/caret-up-solid.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/caret-up-solid.imageset/caret-up-solid.png b/ReflectWidget/Assets.xcassets/custom_icon/caret-up-solid.imageset/caret-up-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/caret-up-solid.imageset/caret-up-solid.png rename to ReflectWidget/Assets.xcassets/custom_icon/caret-up-solid.imageset/caret-up-solid.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/chess-king-solid.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/chess-king-solid.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/chess-king-solid.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/chess-king-solid.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/chess-king-solid.imageset/chess-king-solid.png b/ReflectWidget/Assets.xcassets/custom_icon/chess-king-solid.imageset/chess-king-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/chess-king-solid.imageset/chess-king-solid.png rename to ReflectWidget/Assets.xcassets/custom_icon/chess-king-solid.imageset/chess-king-solid.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/chess-queen-solid.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/chess-queen-solid.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/chess-queen-solid.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/chess-queen-solid.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/chess-queen-solid.imageset/chess-queen-solid.png b/ReflectWidget/Assets.xcassets/custom_icon/chess-queen-solid.imageset/chess-queen-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/chess-queen-solid.imageset/chess-queen-solid.png rename to ReflectWidget/Assets.xcassets/custom_icon/chess-queen-solid.imageset/chess-queen-solid.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/circle-xmark-solid.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/circle-xmark-solid.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/circle-xmark-solid.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/circle-xmark-solid.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/circle-xmark-solid.imageset/circle-xmark-solid.png b/ReflectWidget/Assets.xcassets/custom_icon/circle-xmark-solid.imageset/circle-xmark-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/circle-xmark-solid.imageset/circle-xmark-solid.png rename to ReflectWidget/Assets.xcassets/custom_icon/circle-xmark-solid.imageset/circle-xmark-solid.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/clock-solid.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/clock-solid.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/clock-solid.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/clock-solid.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/clock-solid.imageset/clock-solid.png b/ReflectWidget/Assets.xcassets/custom_icon/clock-solid.imageset/clock-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/clock-solid.imageset/clock-solid.png rename to ReflectWidget/Assets.xcassets/custom_icon/clock-solid.imageset/clock-solid.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/code-compare-solid.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/code-compare-solid.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/code-compare-solid.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/code-compare-solid.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/code-compare-solid.imageset/code-compare-solid.png b/ReflectWidget/Assets.xcassets/custom_icon/code-compare-solid.imageset/code-compare-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/code-compare-solid.imageset/code-compare-solid.png rename to ReflectWidget/Assets.xcassets/custom_icon/code-compare-solid.imageset/code-compare-solid.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/code-solid.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/code-solid.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/code-solid.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/code-solid.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/code-solid.imageset/code-solid.png b/ReflectWidget/Assets.xcassets/custom_icon/code-solid.imageset/code-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/code-solid.imageset/code-solid.png rename to ReflectWidget/Assets.xcassets/custom_icon/code-solid.imageset/code-solid.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/cross-solid.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/cross-solid.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/cross-solid.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/cross-solid.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/cross-solid.imageset/cross-solid.png b/ReflectWidget/Assets.xcassets/custom_icon/cross-solid.imageset/cross-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/cross-solid.imageset/cross-solid.png rename to ReflectWidget/Assets.xcassets/custom_icon/cross-solid.imageset/cross-solid.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/crosshairs-solid.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/crosshairs-solid.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/crosshairs-solid.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/crosshairs-solid.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/crosshairs-solid.imageset/crosshairs-solid.png b/ReflectWidget/Assets.xcassets/custom_icon/crosshairs-solid.imageset/crosshairs-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/crosshairs-solid.imageset/crosshairs-solid.png rename to ReflectWidget/Assets.xcassets/custom_icon/crosshairs-solid.imageset/crosshairs-solid.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/crown-solid.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/crown-solid.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/crown-solid.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/crown-solid.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/crown-solid.imageset/crown-solid.png b/ReflectWidget/Assets.xcassets/custom_icon/crown-solid.imageset/crown-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/crown-solid.imageset/crown-solid.png rename to ReflectWidget/Assets.xcassets/custom_icon/crown-solid.imageset/crown-solid.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/dharmachakra-solid.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/dharmachakra-solid.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/dharmachakra-solid.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/dharmachakra-solid.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/dharmachakra-solid.imageset/dharmachakra-solid.png b/ReflectWidget/Assets.xcassets/custom_icon/dharmachakra-solid.imageset/dharmachakra-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/dharmachakra-solid.imageset/dharmachakra-solid.png rename to ReflectWidget/Assets.xcassets/custom_icon/dharmachakra-solid.imageset/dharmachakra-solid.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/dice-d20-solid.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/dice-d20-solid.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/dice-d20-solid.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/dice-d20-solid.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/dice-d20-solid.imageset/dice-d20-solid.png b/ReflectWidget/Assets.xcassets/custom_icon/dice-d20-solid.imageset/dice-d20-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/dice-d20-solid.imageset/dice-d20-solid.png rename to ReflectWidget/Assets.xcassets/custom_icon/dice-d20-solid.imageset/dice-d20-solid.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/dice-one-solid.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/dice-one-solid.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/dice-one-solid.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/dice-one-solid.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/dice-one-solid.imageset/dice-one-solid.png b/ReflectWidget/Assets.xcassets/custom_icon/dice-one-solid.imageset/dice-one-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/dice-one-solid.imageset/dice-one-solid.png rename to ReflectWidget/Assets.xcassets/custom_icon/dice-one-solid.imageset/dice-one-solid.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/divide-solid.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/divide-solid.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/divide-solid.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/divide-solid.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/divide-solid.imageset/divide-solid.png b/ReflectWidget/Assets.xcassets/custom_icon/divide-solid.imageset/divide-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/divide-solid.imageset/divide-solid.png rename to ReflectWidget/Assets.xcassets/custom_icon/divide-solid.imageset/divide-solid.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/dollar-sign-solid.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/dollar-sign-solid.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/dollar-sign-solid.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/dollar-sign-solid.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/dollar-sign-solid.imageset/dollar-sign-solid.png b/ReflectWidget/Assets.xcassets/custom_icon/dollar-sign-solid.imageset/dollar-sign-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/dollar-sign-solid.imageset/dollar-sign-solid.png rename to ReflectWidget/Assets.xcassets/custom_icon/dollar-sign-solid.imageset/dollar-sign-solid.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/dragon-solid.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/dragon-solid.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/dragon-solid.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/dragon-solid.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/dragon-solid.imageset/dragon-solid.png b/ReflectWidget/Assets.xcassets/custom_icon/dragon-solid.imageset/dragon-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/dragon-solid.imageset/dragon-solid.png rename to ReflectWidget/Assets.xcassets/custom_icon/dragon-solid.imageset/dragon-solid.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/egg-solid.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/egg-solid.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/egg-solid.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/egg-solid.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/egg-solid.imageset/egg-solid.png b/ReflectWidget/Assets.xcassets/custom_icon/egg-solid.imageset/egg-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/egg-solid.imageset/egg-solid.png rename to ReflectWidget/Assets.xcassets/custom_icon/egg-solid.imageset/egg-solid.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/empire-brands.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/empire-brands.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/empire-brands.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/empire-brands.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/empire-brands.imageset/empire-brands.png b/ReflectWidget/Assets.xcassets/custom_icon/empire-brands.imageset/empire-brands.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/empire-brands.imageset/empire-brands.png rename to ReflectWidget/Assets.xcassets/custom_icon/empire-brands.imageset/empire-brands.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/exclamation-solid.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/exclamation-solid.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/exclamation-solid.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/exclamation-solid.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/exclamation-solid.imageset/exclamation-solid.png b/ReflectWidget/Assets.xcassets/custom_icon/exclamation-solid.imageset/exclamation-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/exclamation-solid.imageset/exclamation-solid.png rename to ReflectWidget/Assets.xcassets/custom_icon/exclamation-solid.imageset/exclamation-solid.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/eye-solid.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/eye-solid.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/eye-solid.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/eye-solid.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/eye-solid.imageset/eye-solid.png b/ReflectWidget/Assets.xcassets/custom_icon/eye-solid.imageset/eye-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/eye-solid.imageset/eye-solid.png rename to ReflectWidget/Assets.xcassets/custom_icon/eye-solid.imageset/eye-solid.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/fan-solid.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/fan-solid.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/fan-solid.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/fan-solid.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/fan-solid.imageset/fan-solid.png b/ReflectWidget/Assets.xcassets/custom_icon/fan-solid.imageset/fan-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/fan-solid.imageset/fan-solid.png rename to ReflectWidget/Assets.xcassets/custom_icon/fan-solid.imageset/fan-solid.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/fire-solid.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/fire-solid.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/fire-solid.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/fire-solid.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/fire-solid.imageset/fire-solid.png b/ReflectWidget/Assets.xcassets/custom_icon/fire-solid.imageset/fire-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/fire-solid.imageset/fire-solid.png rename to ReflectWidget/Assets.xcassets/custom_icon/fire-solid.imageset/fire-solid.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/floppy-disk-solid.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/floppy-disk-solid.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/floppy-disk-solid.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/floppy-disk-solid.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/floppy-disk-solid.imageset/floppy-disk-solid.png b/ReflectWidget/Assets.xcassets/custom_icon/floppy-disk-solid.imageset/floppy-disk-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/floppy-disk-solid.imageset/floppy-disk-solid.png rename to ReflectWidget/Assets.xcassets/custom_icon/floppy-disk-solid.imageset/floppy-disk-solid.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/fly-brands.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/fly-brands.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/fly-brands.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/fly-brands.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/fly-brands.imageset/fly-brands.png b/ReflectWidget/Assets.xcassets/custom_icon/fly-brands.imageset/fly-brands.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/fly-brands.imageset/fly-brands.png rename to ReflectWidget/Assets.xcassets/custom_icon/fly-brands.imageset/fly-brands.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/fort-awesome-brands.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/fort-awesome-brands.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/fort-awesome-brands.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/fort-awesome-brands.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/fort-awesome-brands.imageset/fort-awesome-brands.png b/ReflectWidget/Assets.xcassets/custom_icon/fort-awesome-brands.imageset/fort-awesome-brands.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/fort-awesome-brands.imageset/fort-awesome-brands.png rename to ReflectWidget/Assets.xcassets/custom_icon/fort-awesome-brands.imageset/fort-awesome-brands.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/frown-regular.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/frown-regular.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/frown-regular.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/frown-regular.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/frown-regular.imageset/frown-regular.png b/ReflectWidget/Assets.xcassets/custom_icon/frown-regular.imageset/frown-regular.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/frown-regular.imageset/frown-regular.png rename to ReflectWidget/Assets.xcassets/custom_icon/frown-regular.imageset/frown-regular.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/futbol-solid.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/futbol-solid.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/futbol-solid.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/futbol-solid.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/futbol-solid.imageset/futbol-solid.png b/ReflectWidget/Assets.xcassets/custom_icon/futbol-solid.imageset/futbol-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/futbol-solid.imageset/futbol-solid.png rename to ReflectWidget/Assets.xcassets/custom_icon/futbol-solid.imageset/futbol-solid.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/gem-solid.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/gem-solid.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/gem-solid.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/gem-solid.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/gem-solid.imageset/gem-solid.png b/ReflectWidget/Assets.xcassets/custom_icon/gem-solid.imageset/gem-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/gem-solid.imageset/gem-solid.png rename to ReflectWidget/Assets.xcassets/custom_icon/gem-solid.imageset/gem-solid.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/grin-regular.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/grin-regular.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/grin-regular.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/grin-regular.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/grin-regular.imageset/grin-regular.png b/ReflectWidget/Assets.xcassets/custom_icon/grin-regular.imageset/grin-regular.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/grin-regular.imageset/grin-regular.png rename to ReflectWidget/Assets.xcassets/custom_icon/grin-regular.imageset/grin-regular.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/heart-crack-solid.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/heart-crack-solid.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/heart-crack-solid.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/heart-crack-solid.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/heart-crack-solid.imageset/heart-crack-solid.png b/ReflectWidget/Assets.xcassets/custom_icon/heart-crack-solid.imageset/heart-crack-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/heart-crack-solid.imageset/heart-crack-solid.png rename to ReflectWidget/Assets.xcassets/custom_icon/heart-crack-solid.imageset/heart-crack-solid.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/heart-solid.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/heart-solid.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/heart-solid.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/heart-solid.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/heart-solid.imageset/heart-solid.png b/ReflectWidget/Assets.xcassets/custom_icon/heart-solid.imageset/heart-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/heart-solid.imageset/heart-solid.png rename to ReflectWidget/Assets.xcassets/custom_icon/heart-solid.imageset/heart-solid.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/hotjar-brands.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/hotjar-brands.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/hotjar-brands.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/hotjar-brands.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/hotjar-brands.imageset/hotjar-brands.png b/ReflectWidget/Assets.xcassets/custom_icon/hotjar-brands.imageset/hotjar-brands.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/hotjar-brands.imageset/hotjar-brands.png rename to ReflectWidget/Assets.xcassets/custom_icon/hotjar-brands.imageset/hotjar-brands.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/jet-fighter-solid.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/jet-fighter-solid.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/jet-fighter-solid.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/jet-fighter-solid.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/jet-fighter-solid.imageset/jet-fighter-solid.png b/ReflectWidget/Assets.xcassets/custom_icon/jet-fighter-solid.imageset/jet-fighter-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/jet-fighter-solid.imageset/jet-fighter-solid.png rename to ReflectWidget/Assets.xcassets/custom_icon/jet-fighter-solid.imageset/jet-fighter-solid.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/lemon-solid.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/lemon-solid.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/lemon-solid.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/lemon-solid.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/lemon-solid.imageset/lemon-solid.png b/ReflectWidget/Assets.xcassets/custom_icon/lemon-solid.imageset/lemon-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/lemon-solid.imageset/lemon-solid.png rename to ReflectWidget/Assets.xcassets/custom_icon/lemon-solid.imageset/lemon-solid.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/life-ring-solid.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/life-ring-solid.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/life-ring-solid.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/life-ring-solid.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/life-ring-solid.imageset/life-ring-solid.png b/ReflectWidget/Assets.xcassets/custom_icon/life-ring-solid.imageset/life-ring-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/life-ring-solid.imageset/life-ring-solid.png rename to ReflectWidget/Assets.xcassets/custom_icon/life-ring-solid.imageset/life-ring-solid.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/lightbulb-solid.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/lightbulb-solid.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/lightbulb-solid.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/lightbulb-solid.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/lightbulb-solid.imageset/lightbulb-solid.png b/ReflectWidget/Assets.xcassets/custom_icon/lightbulb-solid.imageset/lightbulb-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/lightbulb-solid.imageset/lightbulb-solid.png rename to ReflectWidget/Assets.xcassets/custom_icon/lightbulb-solid.imageset/lightbulb-solid.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/location-crosshairs-solid.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/location-crosshairs-solid.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/location-crosshairs-solid.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/location-crosshairs-solid.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/location-crosshairs-solid.imageset/location-crosshairs-solid.png b/ReflectWidget/Assets.xcassets/custom_icon/location-crosshairs-solid.imageset/location-crosshairs-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/location-crosshairs-solid.imageset/location-crosshairs-solid.png rename to ReflectWidget/Assets.xcassets/custom_icon/location-crosshairs-solid.imageset/location-crosshairs-solid.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/meh-regular.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/meh-regular.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/meh-regular.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/meh-regular.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/meh-regular.imageset/meh-regular.png b/ReflectWidget/Assets.xcassets/custom_icon/meh-regular.imageset/meh-regular.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/meh-regular.imageset/meh-regular.png rename to ReflectWidget/Assets.xcassets/custom_icon/meh-regular.imageset/meh-regular.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/meteor-solid.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/meteor-solid.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/meteor-solid.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/meteor-solid.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/meteor-solid.imageset/meteor-solid.png b/ReflectWidget/Assets.xcassets/custom_icon/meteor-solid.imageset/meteor-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/meteor-solid.imageset/meteor-solid.png rename to ReflectWidget/Assets.xcassets/custom_icon/meteor-solid.imageset/meteor-solid.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/microphone-solid.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/microphone-solid.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/microphone-solid.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/microphone-solid.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/microphone-solid.imageset/microphone-solid.png b/ReflectWidget/Assets.xcassets/custom_icon/microphone-solid.imageset/microphone-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/microphone-solid.imageset/microphone-solid.png rename to ReflectWidget/Assets.xcassets/custom_icon/microphone-solid.imageset/microphone-solid.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/moon-solid.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/moon-solid.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/moon-solid.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/moon-solid.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/moon-solid.imageset/moon-solid.png b/ReflectWidget/Assets.xcassets/custom_icon/moon-solid.imageset/moon-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/moon-solid.imageset/moon-solid.png rename to ReflectWidget/Assets.xcassets/custom_icon/moon-solid.imageset/moon-solid.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/peace-solid.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/peace-solid.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/peace-solid.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/peace-solid.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/peace-solid.imageset/peace-solid.png b/ReflectWidget/Assets.xcassets/custom_icon/peace-solid.imageset/peace-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/peace-solid.imageset/peace-solid.png rename to ReflectWidget/Assets.xcassets/custom_icon/peace-solid.imageset/peace-solid.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/pizza-slice-solid.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/pizza-slice-solid.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/pizza-slice-solid.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/pizza-slice-solid.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/pizza-slice-solid.imageset/pizza-slice-solid.png b/ReflectWidget/Assets.xcassets/custom_icon/pizza-slice-solid.imageset/pizza-slice-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/pizza-slice-solid.imageset/pizza-slice-solid.png rename to ReflectWidget/Assets.xcassets/custom_icon/pizza-slice-solid.imageset/pizza-slice-solid.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/poo-solid.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/poo-solid.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/poo-solid.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/poo-solid.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/poo-solid.imageset/poo-solid.png b/ReflectWidget/Assets.xcassets/custom_icon/poo-solid.imageset/poo-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/poo-solid.imageset/poo-solid.png rename to ReflectWidget/Assets.xcassets/custom_icon/poo-solid.imageset/poo-solid.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/poo-storm-solid.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/poo-storm-solid.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/poo-storm-solid.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/poo-storm-solid.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/poo-storm-solid.imageset/poo-storm-solid.png b/ReflectWidget/Assets.xcassets/custom_icon/poo-storm-solid.imageset/poo-storm-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/poo-storm-solid.imageset/poo-storm-solid.png rename to ReflectWidget/Assets.xcassets/custom_icon/poo-storm-solid.imageset/poo-storm-solid.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/rainbow-solid.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/rainbow-solid.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/rainbow-solid.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/rainbow-solid.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/rainbow-solid.imageset/rainbow-solid.png b/ReflectWidget/Assets.xcassets/custom_icon/rainbow-solid.imageset/rainbow-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/rainbow-solid.imageset/rainbow-solid.png rename to ReflectWidget/Assets.xcassets/custom_icon/rainbow-solid.imageset/rainbow-solid.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/sad-tear-regular.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/sad-tear-regular.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/sad-tear-regular.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/sad-tear-regular.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/sad-tear-regular.imageset/sad-tear-regular.png b/ReflectWidget/Assets.xcassets/custom_icon/sad-tear-regular.imageset/sad-tear-regular.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/sad-tear-regular.imageset/sad-tear-regular.png rename to ReflectWidget/Assets.xcassets/custom_icon/sad-tear-regular.imageset/sad-tear-regular.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/shuttle-space-solid.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/shuttle-space-solid.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/shuttle-space-solid.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/shuttle-space-solid.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/shuttle-space-solid.imageset/shuttle-space-solid.png b/ReflectWidget/Assets.xcassets/custom_icon/shuttle-space-solid.imageset/shuttle-space-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/shuttle-space-solid.imageset/shuttle-space-solid.png rename to ReflectWidget/Assets.xcassets/custom_icon/shuttle-space-solid.imageset/shuttle-space-solid.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/skull-crossbones-solid.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/skull-crossbones-solid.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/skull-crossbones-solid.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/skull-crossbones-solid.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/skull-crossbones-solid.imageset/skull-crossbones-solid.png b/ReflectWidget/Assets.xcassets/custom_icon/skull-crossbones-solid.imageset/skull-crossbones-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/skull-crossbones-solid.imageset/skull-crossbones-solid.png rename to ReflectWidget/Assets.xcassets/custom_icon/skull-crossbones-solid.imageset/skull-crossbones-solid.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/skull-solid.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/skull-solid.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/skull-solid.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/skull-solid.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/skull-solid.imageset/skull-solid.png b/ReflectWidget/Assets.xcassets/custom_icon/skull-solid.imageset/skull-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/skull-solid.imageset/skull-solid.png rename to ReflectWidget/Assets.xcassets/custom_icon/skull-solid.imageset/skull-solid.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/smile-beam-regular.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/smile-beam-regular.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/smile-beam-regular.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/smile-beam-regular.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/smile-beam-regular.imageset/smile-beam-regular.png b/ReflectWidget/Assets.xcassets/custom_icon/smile-beam-regular.imageset/smile-beam-regular.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/smile-beam-regular.imageset/smile-beam-regular.png rename to ReflectWidget/Assets.xcassets/custom_icon/smile-beam-regular.imageset/smile-beam-regular.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/star-solid.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/star-solid.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/star-solid.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/star-solid.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/star-solid.imageset/star-solid.png b/ReflectWidget/Assets.xcassets/custom_icon/star-solid.imageset/star-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/star-solid.imageset/star-solid.png rename to ReflectWidget/Assets.xcassets/custom_icon/star-solid.imageset/star-solid.png diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/virus-covid-solid.imageset/Contents.json b/ReflectWidget/Assets.xcassets/custom_icon/virus-covid-solid.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/virus-covid-solid.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/custom_icon/virus-covid-solid.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/custom_icon/virus-covid-solid.imageset/virus-covid-solid.png b/ReflectWidget/Assets.xcassets/custom_icon/virus-covid-solid.imageset/virus-covid-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/custom_icon/virus-covid-solid.imageset/virus-covid-solid.png rename to ReflectWidget/Assets.xcassets/custom_icon/virus-covid-solid.imageset/virus-covid-solid.png diff --git a/FeelsWidget2/Assets.xcassets/default_image/Contents.json b/ReflectWidget/Assets.xcassets/default_image/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/default_image/Contents.json rename to ReflectWidget/Assets.xcassets/default_image/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/default_image/average.imageset/Contents.json b/ReflectWidget/Assets.xcassets/default_image/average.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/default_image/average.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/default_image/average.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/default_image/average.imageset/meh-regular.png b/ReflectWidget/Assets.xcassets/default_image/average.imageset/meh-regular.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/default_image/average.imageset/meh-regular.png rename to ReflectWidget/Assets.xcassets/default_image/average.imageset/meh-regular.png diff --git a/FeelsWidget2/Assets.xcassets/default_image/bad.imageset/Contents.json b/ReflectWidget/Assets.xcassets/default_image/bad.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/default_image/bad.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/default_image/bad.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/default_image/bad.imageset/frown-regular.png b/ReflectWidget/Assets.xcassets/default_image/bad.imageset/frown-regular.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/default_image/bad.imageset/frown-regular.png rename to ReflectWidget/Assets.xcassets/default_image/bad.imageset/frown-regular.png diff --git a/FeelsWidget2/Assets.xcassets/default_image/good.imageset/Contents.json b/ReflectWidget/Assets.xcassets/default_image/good.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/default_image/good.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/default_image/good.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/default_image/good.imageset/grin-regular.png b/ReflectWidget/Assets.xcassets/default_image/good.imageset/grin-regular.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/default_image/good.imageset/grin-regular.png rename to ReflectWidget/Assets.xcassets/default_image/good.imageset/grin-regular.png diff --git a/FeelsWidget2/Assets.xcassets/default_image/great.imageset/Contents.json b/ReflectWidget/Assets.xcassets/default_image/great.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/default_image/great.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/default_image/great.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/default_image/great.imageset/smile-beam-regular.png b/ReflectWidget/Assets.xcassets/default_image/great.imageset/smile-beam-regular.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/default_image/great.imageset/smile-beam-regular.png rename to ReflectWidget/Assets.xcassets/default_image/great.imageset/smile-beam-regular.png diff --git a/FeelsWidget2/Assets.xcassets/default_image/horrible.imageset/Contents.json b/ReflectWidget/Assets.xcassets/default_image/horrible.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/default_image/horrible.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/default_image/horrible.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/default_image/horrible.imageset/sad-tear-regular.png b/ReflectWidget/Assets.xcassets/default_image/horrible.imageset/sad-tear-regular.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/default_image/horrible.imageset/sad-tear-regular.png rename to ReflectWidget/Assets.xcassets/default_image/horrible.imageset/sad-tear-regular.png diff --git a/FeelsWidget2/Assets.xcassets/default_image/missing.imageset/Contents.json b/ReflectWidget/Assets.xcassets/default_image/missing.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/default_image/missing.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/default_image/missing.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/default_image/missing.imageset/xmark-solid.png b/ReflectWidget/Assets.xcassets/default_image/missing.imageset/xmark-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/default_image/missing.imageset/xmark-solid.png rename to ReflectWidget/Assets.xcassets/default_image/missing.imageset/xmark-solid.png diff --git a/FeelsWidget2/Assets.xcassets/default_image/xmark-solid.imageset/Contents.json b/ReflectWidget/Assets.xcassets/default_image/xmark-solid.imageset/Contents.json similarity index 100% rename from FeelsWidget2/Assets.xcassets/default_image/xmark-solid.imageset/Contents.json rename to ReflectWidget/Assets.xcassets/default_image/xmark-solid.imageset/Contents.json diff --git a/FeelsWidget2/Assets.xcassets/default_image/xmark-solid.imageset/xmark-solid.png b/ReflectWidget/Assets.xcassets/default_image/xmark-solid.imageset/xmark-solid.png similarity index 100% rename from FeelsWidget2/Assets.xcassets/default_image/xmark-solid.imageset/xmark-solid.png rename to ReflectWidget/Assets.xcassets/default_image/xmark-solid.imageset/xmark-solid.png diff --git a/FeelsWidget2/FeelsGraphicWidget.swift b/ReflectWidget/ReflectGraphicWidget.swift similarity index 90% rename from FeelsWidget2/FeelsGraphicWidget.swift rename to ReflectWidget/ReflectGraphicWidget.swift index ceb69d0..64dbb37 100644 --- a/FeelsWidget2/FeelsGraphicWidget.swift +++ b/ReflectWidget/ReflectGraphicWidget.swift @@ -1,6 +1,6 @@ // -// FeelsGraphicWidget.swift -// FeelsWidget +// ReflectGraphicWidget.swift +// ReflectWidget // // Graphic mood widget (small only) // @@ -11,14 +11,14 @@ import Intents // MARK: - Widget Configuration -struct FeelsGraphicWidget: Widget { - let kind: String = "FeelsGraphicWidget" +struct ReflectGraphicWidget: Widget { + let kind: String = "ReflectGraphicWidget" var body: some WidgetConfiguration { IntentConfiguration(kind: kind, intent: ConfigurationIntent.self, provider: Provider()) { entry in - FeelsGraphicWidgetEntryView(entry: entry) + ReflectGraphicWidgetEntryView(entry: entry) } .configurationDisplayName("Mood Graphic") .description("") @@ -29,7 +29,7 @@ struct FeelsGraphicWidget: Widget { // MARK: - Entry View -struct FeelsGraphicWidgetEntryView: View { +struct ReflectGraphicWidgetEntryView: View { @Environment(\.sizeCategory) var sizeCategory @Environment(\.widgetFamily) var family @@ -81,7 +81,7 @@ struct SmallGraphicWidgetView: View { // MARK: - Previews #Preview("Graphic - Great", as: .systemSmall) { - FeelsGraphicWidget() + ReflectGraphicWidget() } timeline: { SimpleEntry( date: Date(), diff --git a/FeelsWidget2/FeelsIconWidget.swift b/ReflectWidget/ReflectIconWidget.swift similarity index 82% rename from FeelsWidget2/FeelsIconWidget.swift rename to ReflectWidget/ReflectIconWidget.swift index d5d636b..33c5bc7 100644 --- a/FeelsWidget2/FeelsIconWidget.swift +++ b/ReflectWidget/ReflectIconWidget.swift @@ -1,6 +1,6 @@ // -// FeelsIconWidget.swift -// FeelsWidget +// ReflectIconWidget.swift +// ReflectWidget // // Custom icon widget (small only) // @@ -11,16 +11,16 @@ import Intents // MARK: - Widget Configuration -struct FeelsIconWidget: Widget { - let kind: String = "FeelsIconWidget" +struct ReflectIconWidget: Widget { + let kind: String = "ReflectIconWidget" var body: some WidgetConfiguration { IntentConfiguration(kind: kind, intent: ConfigurationIntent.self, provider: Provider()) { entry in - FeelsIconWidgetEntryView(entry: entry) + ReflectIconWidgetEntryView(entry: entry) } - .configurationDisplayName("Feels Icon") + .configurationDisplayName("Reflect Icon") .description("") .supportedFamilies([.systemSmall]) .contentMarginsDisabled() @@ -29,7 +29,7 @@ struct FeelsIconWidget: Widget { // MARK: - Entry View -struct FeelsIconWidgetEntryView: View { +struct ReflectIconWidgetEntryView: View { @Environment(\.sizeCategory) var sizeCategory @Environment(\.widgetFamily) var family @@ -63,7 +63,7 @@ struct SmallIconView: View { // MARK: - Preview #Preview("Custom Icon", as: .systemSmall) { - FeelsIconWidget() + ReflectIconWidget() } timeline: { SimpleEntry( date: Date(), diff --git a/FeelsWidget2/FeelsLiveActivity.swift b/ReflectWidget/ReflectLiveActivity.swift similarity index 99% rename from FeelsWidget2/FeelsLiveActivity.swift rename to ReflectWidget/ReflectLiveActivity.swift index 58aa9d2..81fe316 100644 --- a/FeelsWidget2/FeelsLiveActivity.swift +++ b/ReflectWidget/ReflectLiveActivity.swift @@ -1,6 +1,6 @@ // -// FeelsLiveActivity.swift -// FeelsWidget +// ReflectLiveActivity.swift +// ReflectWidget // // Live Activity for mood streak tracking (Dynamic Island + Lock Screen) // diff --git a/FeelsWidget2/FeelsMoodControlWidget.swift b/ReflectWidget/ReflectMoodControlWidget.swift similarity index 50% rename from FeelsWidget2/FeelsMoodControlWidget.swift rename to ReflectWidget/ReflectMoodControlWidget.swift index 1613d2b..7ceb031 100644 --- a/FeelsWidget2/FeelsMoodControlWidget.swift +++ b/ReflectWidget/ReflectMoodControlWidget.swift @@ -1,6 +1,6 @@ // -// FeelsMoodControlWidget.swift -// FeelsWidget +// ReflectMoodControlWidget.swift +// ReflectWidget // // Control Center widget for quick mood logging // @@ -11,23 +11,23 @@ import AppIntents // MARK: - Control Center Widget -struct FeelsMoodControlWidget: ControlWidget { +struct ReflectMoodControlWidget: ControlWidget { var body: some ControlWidgetConfiguration { - StaticControlConfiguration(kind: "FeelsMoodControl") { - ControlWidgetButton(action: OpenFeelsIntent()) { + StaticControlConfiguration(kind: "ReflectMoodControl") { + ControlWidgetButton(action: OpenReflectIntent()) { Label("Log Mood", systemImage: "face.smiling") } } .displayName("Log Mood") - .description("Open Feels to log your mood") + .description("Open Reflect to log your mood") } } // MARK: - Open App Intent -struct OpenFeelsIntent: AppIntent { - static var title: LocalizedStringResource = "Open Feels" - static var description = IntentDescription("Open the Feels app to log your mood") +struct OpenReflectIntent: AppIntent { + static var title: LocalizedStringResource = "Open Reflect" + static var description = IntentDescription("Open the Reflect app to log your mood") static var openAppWhenRun: Bool = true func perform() async throws -> some IntentResult { diff --git a/FeelsWidget2/FeelsTimelineWidget.swift b/ReflectWidget/ReflectTimelineWidget.swift similarity index 97% rename from FeelsWidget2/FeelsTimelineWidget.swift rename to ReflectWidget/ReflectTimelineWidget.swift index fa46567..c293c39 100644 --- a/FeelsWidget2/FeelsTimelineWidget.swift +++ b/ReflectWidget/ReflectTimelineWidget.swift @@ -1,6 +1,6 @@ // -// FeelsTimelineWidget.swift -// FeelsWidget +// ReflectTimelineWidget.swift +// ReflectWidget // // Timeline widget showing mood history (small, medium, large) // @@ -11,16 +11,16 @@ import Intents // MARK: - Widget Configuration -struct FeelsWidget: Widget { - let kind: String = "FeelsWidget" +struct ReflectWidget: Widget { + let kind: String = "ReflectWidget" var body: some WidgetConfiguration { IntentConfiguration(kind: kind, intent: ConfigurationIntent.self, provider: Provider()) { entry in - FeelsWidgetEntryView(entry: entry) + ReflectWidgetEntryView(entry: entry) } - .configurationDisplayName("Feels") + .configurationDisplayName("Reflect") .description("") .supportedFamilies([.systemSmall, .systemMedium, .systemLarge]) } @@ -28,7 +28,7 @@ struct FeelsWidget: Widget { // MARK: - Entry View Router -struct FeelsWidgetEntryView: View { +struct ReflectWidgetEntryView: View { @Environment(\.sizeCategory) var sizeCategory @Environment(\.widgetFamily) var family @@ -495,84 +495,84 @@ private enum WidgetPreviewHelpers { // Small - Logged States #Preview("Timeline Small - Great", as: .systemSmall) { - FeelsWidget() + ReflectWidget() } timeline: { WidgetPreviewHelpers.sampleEntry(timelineCount: 1, startMood: .great) } #Preview("Timeline Small - Good", as: .systemSmall) { - FeelsWidget() + ReflectWidget() } timeline: { WidgetPreviewHelpers.sampleEntry(timelineCount: 1, startMood: .good) } #Preview("Timeline Small - Average", as: .systemSmall) { - FeelsWidget() + ReflectWidget() } timeline: { WidgetPreviewHelpers.sampleEntry(timelineCount: 1, startMood: .average) } #Preview("Timeline Small - Bad", as: .systemSmall) { - FeelsWidget() + ReflectWidget() } timeline: { WidgetPreviewHelpers.sampleEntry(timelineCount: 1, startMood: .bad) } #Preview("Timeline Small - Horrible", as: .systemSmall) { - FeelsWidget() + ReflectWidget() } timeline: { WidgetPreviewHelpers.sampleEntry(timelineCount: 1, startMood: .horrible) } // Small - Voting States #Preview("Timeline Small - Voting", as: .systemSmall) { - FeelsWidget() + ReflectWidget() } timeline: { WidgetPreviewHelpers.sampleEntry(timelineCount: 1, hasVotedToday: false) } #Preview("Timeline Small - Non-Subscriber", as: .systemSmall) { - FeelsWidget() + ReflectWidget() } timeline: { WidgetPreviewHelpers.sampleEntry(timelineCount: 1, hasVotedToday: false, hasSubscription: false) } // Medium - Logged States #Preview("Timeline Medium - Logged", as: .systemMedium) { - FeelsWidget() + ReflectWidget() } timeline: { WidgetPreviewHelpers.sampleEntry(timelineCount: 5) } // Medium - Voting States #Preview("Timeline Medium - Voting", as: .systemMedium) { - FeelsWidget() + ReflectWidget() } timeline: { WidgetPreviewHelpers.sampleEntry(timelineCount: 5, hasVotedToday: false) } #Preview("Timeline Medium - Non-Subscriber", as: .systemMedium) { - FeelsWidget() + ReflectWidget() } timeline: { WidgetPreviewHelpers.sampleEntry(timelineCount: 5, hasVotedToday: false, hasSubscription: false) } // Large - Logged States #Preview("Timeline Large - Logged", as: .systemLarge) { - FeelsWidget() + ReflectWidget() } timeline: { WidgetPreviewHelpers.sampleEntry(timelineCount: 10) } // Large - Voting States #Preview("Timeline Large - Voting", as: .systemLarge) { - FeelsWidget() + ReflectWidget() } timeline: { WidgetPreviewHelpers.sampleEntry(timelineCount: 10, hasVotedToday: false) } #Preview("Timeline Large - Non-Subscriber", as: .systemLarge) { - FeelsWidget() + ReflectWidget() } timeline: { WidgetPreviewHelpers.sampleEntry(timelineCount: 10, hasVotedToday: false, hasSubscription: false) } diff --git a/FeelsWidget2/FeelsVoteWidget.swift b/ReflectWidget/ReflectVoteWidget.swift similarity index 95% rename from FeelsWidget2/FeelsVoteWidget.swift rename to ReflectWidget/ReflectVoteWidget.swift index dbf1092..6c3315c 100644 --- a/FeelsWidget2/FeelsVoteWidget.swift +++ b/ReflectWidget/ReflectVoteWidget.swift @@ -1,6 +1,6 @@ // -// FeelsVoteWidget.swift -// FeelsWidget +// ReflectVoteWidget.swift +// ReflectWidget // // Interactive widget for mood voting (iOS 17+) // @@ -11,12 +11,12 @@ import AppIntents // MARK: - Widget Configuration -struct FeelsVoteWidget: Widget { - let kind: String = "FeelsVoteWidget" +struct ReflectVoteWidget: Widget { + let kind: String = "ReflectVoteWidget" var body: some WidgetConfiguration { StaticConfiguration(kind: kind, provider: VoteWidgetProvider()) { entry in - FeelsVoteWidgetEntryView(entry: entry) + ReflectVoteWidgetEntryView(entry: entry) } .configurationDisplayName("Mood Vote") .description("Quickly rate your mood for today") @@ -26,7 +26,7 @@ struct FeelsVoteWidget: Widget { // MARK: - Entry View -struct FeelsVoteWidgetEntryView: View { +struct ReflectVoteWidgetEntryView: View { @Environment(\.widgetFamily) var family var entry: VoteWidgetProvider.Entry @@ -194,7 +194,7 @@ struct VotedStatsView: View { struct NonSubscriberView: View { var body: some View { - Link(destination: URL(string: "feels://subscribe")!) { + Link(destination: URL(string: "reflect://subscribe")!) { VStack(spacing: 8) { Image(systemName: "heart.fill") .font(.largeTitle) @@ -234,7 +234,7 @@ private enum VoteWidgetPreviewHelpers { // MARK: - Small Widget Previews #Preview("Vote Small - Not Voted", as: .systemSmall) { - FeelsVoteWidget() + ReflectVoteWidget() } timeline: { VoteWidgetEntry( date: Date(), @@ -248,7 +248,7 @@ private enum VoteWidgetPreviewHelpers { } #Preview("Vote Small - Voted Great", as: .systemSmall) { - FeelsVoteWidget() + ReflectVoteWidget() } timeline: { VoteWidgetEntry( date: Date(), @@ -262,7 +262,7 @@ private enum VoteWidgetPreviewHelpers { } #Preview("Vote Small - Voted Good", as: .systemSmall) { - FeelsVoteWidget() + ReflectVoteWidget() } timeline: { VoteWidgetEntry( date: Date(), @@ -276,7 +276,7 @@ private enum VoteWidgetPreviewHelpers { } #Preview("Vote Small - Voted Average", as: .systemSmall) { - FeelsVoteWidget() + ReflectVoteWidget() } timeline: { VoteWidgetEntry( date: Date(), @@ -290,7 +290,7 @@ private enum VoteWidgetPreviewHelpers { } #Preview("Vote Small - Voted Bad", as: .systemSmall) { - FeelsVoteWidget() + ReflectVoteWidget() } timeline: { VoteWidgetEntry( date: Date(), @@ -304,7 +304,7 @@ private enum VoteWidgetPreviewHelpers { } #Preview("Vote Small - Voted Horrible", as: .systemSmall) { - FeelsVoteWidget() + ReflectVoteWidget() } timeline: { VoteWidgetEntry( date: Date(), @@ -318,7 +318,7 @@ private enum VoteWidgetPreviewHelpers { } #Preview("Vote Small - Non-Subscriber", as: .systemSmall) { - FeelsVoteWidget() + ReflectVoteWidget() } timeline: { VoteWidgetEntry( date: Date(), @@ -334,7 +334,7 @@ private enum VoteWidgetPreviewHelpers { // MARK: - Medium Widget Previews #Preview("Vote Medium - Not Voted", as: .systemMedium) { - FeelsVoteWidget() + ReflectVoteWidget() } timeline: { VoteWidgetEntry( date: Date(), @@ -348,7 +348,7 @@ private enum VoteWidgetPreviewHelpers { } #Preview("Vote Medium - Voted Great", as: .systemMedium) { - FeelsVoteWidget() + ReflectVoteWidget() } timeline: { VoteWidgetEntry( date: Date(), @@ -362,7 +362,7 @@ private enum VoteWidgetPreviewHelpers { } #Preview("Vote Medium - Voted Good", as: .systemMedium) { - FeelsVoteWidget() + ReflectVoteWidget() } timeline: { VoteWidgetEntry( date: Date(), @@ -376,7 +376,7 @@ private enum VoteWidgetPreviewHelpers { } #Preview("Vote Medium - Voted Average", as: .systemMedium) { - FeelsVoteWidget() + ReflectVoteWidget() } timeline: { VoteWidgetEntry( date: Date(), @@ -390,7 +390,7 @@ private enum VoteWidgetPreviewHelpers { } #Preview("Vote Medium - Voted Bad", as: .systemMedium) { - FeelsVoteWidget() + ReflectVoteWidget() } timeline: { VoteWidgetEntry( date: Date(), @@ -404,7 +404,7 @@ private enum VoteWidgetPreviewHelpers { } #Preview("Vote Medium - Voted Horrible", as: .systemMedium) { - FeelsVoteWidget() + ReflectVoteWidget() } timeline: { VoteWidgetEntry( date: Date(), @@ -418,7 +418,7 @@ private enum VoteWidgetPreviewHelpers { } #Preview("Vote Medium - Non-Subscriber", as: .systemMedium) { - FeelsVoteWidget() + ReflectVoteWidget() } timeline: { VoteWidgetEntry( date: Date(), diff --git a/FeelsWidget2/FeelsWidget.intentdefinition b/ReflectWidget/ReflectWidget.intentdefinition similarity index 100% rename from FeelsWidget2/FeelsWidget.intentdefinition rename to ReflectWidget/ReflectWidget.intentdefinition diff --git a/ReflectWidget/WidgetBundle.swift b/ReflectWidget/WidgetBundle.swift new file mode 100644 index 0000000..777761d --- /dev/null +++ b/ReflectWidget/WidgetBundle.swift @@ -0,0 +1,21 @@ +// +// WidgetBundle.swift +// ReflectWidget +// +// Main widget bundle that registers all Reflect widgets +// + +import WidgetKit +import SwiftUI + +@main +struct ReflectBundle: WidgetBundle { + var body: some Widget { + ReflectWidget() +// ReflectGraphicWidget() + ReflectIconWidget() + ReflectVoteWidget() + ReflectMoodControlWidget() + MoodStreakLiveActivity() + } +} diff --git a/FeelsWidget2/WidgetDataProvider.swift b/ReflectWidget/WidgetDataProvider.swift similarity index 93% rename from FeelsWidget2/WidgetDataProvider.swift rename to ReflectWidget/WidgetDataProvider.swift index 9e129ee..d569ba9 100644 --- a/FeelsWidget2/WidgetDataProvider.swift +++ b/ReflectWidget/WidgetDataProvider.swift @@ -1,6 +1,6 @@ // // WidgetDataProvider.swift -// FeelsWidget +// ReflectWidget // // Typealias to ExtensionDataProvider for backward compatibility. // diff --git a/FeelsWidget2/WidgetModels.swift b/ReflectWidget/WidgetModels.swift similarity index 99% rename from FeelsWidget2/WidgetModels.swift rename to ReflectWidget/WidgetModels.swift index 283a510..f9db098 100644 --- a/FeelsWidget2/WidgetModels.swift +++ b/ReflectWidget/WidgetModels.swift @@ -1,6 +1,6 @@ // // WidgetModels.swift -// FeelsWidget +// ReflectWidget // // Data models for widget timeline entries // diff --git a/FeelsWidget2/WidgetProviders.swift b/ReflectWidget/WidgetProviders.swift similarity index 99% rename from FeelsWidget2/WidgetProviders.swift rename to ReflectWidget/WidgetProviders.swift index efaec73..bc6ca5d 100644 --- a/FeelsWidget2/WidgetProviders.swift +++ b/ReflectWidget/WidgetProviders.swift @@ -1,6 +1,6 @@ // // WidgetProviders.swift -// FeelsWidget +// ReflectWidget // // Timeline providers for widget data // diff --git a/FeelsWidget2/WidgetSharedViews.swift b/ReflectWidget/WidgetSharedViews.swift similarity index 96% rename from FeelsWidget2/WidgetSharedViews.swift rename to ReflectWidget/WidgetSharedViews.swift index 3cf59c3..b24c2a7 100644 --- a/FeelsWidget2/WidgetSharedViews.swift +++ b/ReflectWidget/WidgetSharedViews.swift @@ -1,6 +1,6 @@ // // WidgetSharedViews.swift -// FeelsWidget +// ReflectWidget // // Shared voting views used across multiple widgets // @@ -94,7 +94,7 @@ struct VotingView: View { .accessibilityLabel(mood.strValue) .accessibilityHint(String(localized: "Log this mood")) } else { - Link(destination: URL(string: "feels://subscribe")!) { + Link(destination: URL(string: "reflect://subscribe")!) { moodIcon(for: mood, size: size) .frame(minWidth: touchSize, minHeight: touchSize) } @@ -120,7 +120,7 @@ struct VotingView: View { .accessibilityLabel(mood.strValue) .accessibilityHint(String(localized: "Log this mood")) } else { - Link(destination: URL(string: "feels://subscribe")!) { + Link(destination: URL(string: "reflect://subscribe")!) { content } .accessibilityLabel(mood.strValue) @@ -197,7 +197,7 @@ struct LargeVotingView: View { .accessibilityLabel(mood.strValue) .accessibilityHint(String(localized: "Log this mood")) } else { - Link(destination: URL(string: "feels://subscribe")!) { + Link(destination: URL(string: "reflect://subscribe")!) { moodButtonContent(for: mood) } .accessibilityLabel(mood.strValue) @@ -262,7 +262,7 @@ struct InlineVotingView: View { .accessibilityLabel(mood.strValue) .accessibilityHint(String(localized: "Log this mood")) } else { - Link(destination: URL(string: "feels://subscribe")!) { + Link(destination: URL(string: "reflect://subscribe")!) { moodIcon(for: mood) } .accessibilityLabel(mood.strValue) diff --git a/FeelsWidgetExtension-Info.plist b/ReflectWidgetExtension-Info.plist similarity index 100% rename from FeelsWidgetExtension-Info.plist rename to ReflectWidgetExtension-Info.plist diff --git a/Feels Watch App/Feels Watch App.entitlements b/ReflectWidgetExtension.entitlements similarity index 83% rename from Feels Watch App/Feels Watch App.entitlements rename to ReflectWidgetExtension.entitlements index 43871d5..70a2e1c 100644 --- a/Feels Watch App/Feels Watch App.entitlements +++ b/ReflectWidgetExtension.entitlements @@ -6,7 +6,7 @@ development com.apple.developer.icloud-container-identifiers - iCloud.com.88oakapps.feels + iCloud.com.88oakapps.reflect com.apple.developer.icloud-services @@ -14,7 +14,7 @@ com.apple.security.application-groups - group.com.88oakapps.feels + group.com.88oakapps.reflect diff --git a/Feels Watch App/Feels Watch AppDebug.entitlements b/ReflectWidgetExtensionDev.entitlements similarity index 82% rename from Feels Watch App/Feels Watch AppDebug.entitlements rename to ReflectWidgetExtensionDev.entitlements index 0a2a3fd..88e3d63 100644 --- a/Feels Watch App/Feels Watch AppDebug.entitlements +++ b/ReflectWidgetExtensionDev.entitlements @@ -6,7 +6,7 @@ development com.apple.developer.icloud-container-identifiers - iCloud.com.88oakapps.feels.debug + iCloud.com.88oakapps.reflect.debug com.apple.developer.icloud-services @@ -14,7 +14,7 @@ com.apple.security.application-groups - group.com.88oakapps.feels.debug + group.com.88oakapps.reflect.debug diff --git a/Shared/AccessibilityIdentifiers.swift b/Shared/AccessibilityIdentifiers.swift index d612b3f..110b838 100644 --- a/Shared/AccessibilityIdentifiers.swift +++ b/Shared/AccessibilityIdentifiers.swift @@ -1,6 +1,6 @@ // // AccessibilityIdentifiers.swift -// Feels (iOS) +// Reflect (iOS) // // Centralized accessibility identifiers for XCUITest targeting. // diff --git a/Shared/Analytics.swift b/Shared/Analytics.swift index 54bf6cc..3765fe4 100644 --- a/Shared/Analytics.swift +++ b/Shared/Analytics.swift @@ -1,6 +1,6 @@ // // Analytics.swift -// Feels +// Reflect // // Singleton analytics manager wrapping PostHog SDK. // All analytics events flow through this single manager. diff --git a/Shared/AppDelegate.swift b/Shared/AppDelegate.swift index 73c0c69..2ce9fc7 100644 --- a/Shared/AppDelegate.swift +++ b/Shared/AppDelegate.swift @@ -1,6 +1,6 @@ // // AppDelegate.swift -// Feels (iOS) +// Reflect (iOS) // // Created by Trey Tartt on 1/10/22. // diff --git a/Shared/AppShortcuts.swift b/Shared/AppShortcuts.swift index 6d09e94..1d230a2 100644 --- a/Shared/AppShortcuts.swift +++ b/Shared/AppShortcuts.swift @@ -1,6 +1,6 @@ // // AppShortcuts.swift -// Feels +// Reflect // // App Intents and Siri Shortcuts for voice-activated mood logging // @@ -50,7 +50,7 @@ struct MoodEntityQuery: EntityQuery { struct LogMoodIntent: AppIntent { static var title: LocalizedStringResource = "Log Mood" - static var description = IntentDescription("Record your mood for today in Feels") + static var description = IntentDescription("Record your mood for today in Reflect") static var openAppWhenRun: Bool = false @Parameter(title: "Mood") @@ -81,7 +81,7 @@ struct LogMoodIntent: AppIntent { struct CheckTodaysMoodIntent: AppIntent { static var title: LocalizedStringResource = "Check Today's Mood" - static var description = IntentDescription("See what mood you logged today in Feels") + static var description = IntentDescription("See what mood you logged today in Reflect") static var openAppWhenRun: Bool = false @MainActor @@ -176,7 +176,7 @@ struct MoodLoggedSnippetView: View { // MARK: - App Shortcuts Provider -struct FeelsShortcuts: AppShortcutsProvider { +struct ReflectShortcuts: AppShortcutsProvider { static var appShortcuts: [AppShortcut] { AppShortcut( intent: LogMoodIntent(), diff --git a/Shared/Assets.xcassets/AppIcon.appiconset/Contents.json b/Shared/Assets.xcassets/AppIcon.appiconset/Contents.json index 075f343..3e9501f 100644 --- a/Shared/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/Shared/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "FeelsAppIcon.png", + "filename" : "ReflectAppIcon.png", "idiom" : "universal", "platform" : "ios", "size" : "1024x1024" @@ -13,7 +13,7 @@ "value" : "dark" } ], - "filename" : "FeelsAppIcon 1.png", + "filename" : "ReflectAppIcon 1.png", "idiom" : "universal", "platform" : "ios", "size" : "1024x1024" diff --git a/Shared/Assets.xcassets/AppIcon.appiconset/FeelsAppIcon 1.png b/Shared/Assets.xcassets/AppIcon.appiconset/ReflectAppIcon 1.png similarity index 100% rename from Shared/Assets.xcassets/AppIcon.appiconset/FeelsAppIcon 1.png rename to Shared/Assets.xcassets/AppIcon.appiconset/ReflectAppIcon 1.png diff --git a/Shared/Assets.xcassets/AppIcon.appiconset/FeelsAppIcon.png b/Shared/Assets.xcassets/AppIcon.appiconset/ReflectAppIcon.png similarity index 100% rename from Shared/Assets.xcassets/AppIcon.appiconset/FeelsAppIcon.png rename to Shared/Assets.xcassets/AppIcon.appiconset/ReflectAppIcon.png diff --git a/Shared/Assets.xcassets/FeelsAppIcon.imageset/Contents.json b/Shared/Assets.xcassets/ReflectAppIcon.imageset/Contents.json similarity index 86% rename from Shared/Assets.xcassets/FeelsAppIcon.imageset/Contents.json rename to Shared/Assets.xcassets/ReflectAppIcon.imageset/Contents.json index a6ae92c..bd893f3 100644 --- a/Shared/Assets.xcassets/FeelsAppIcon.imageset/Contents.json +++ b/Shared/Assets.xcassets/ReflectAppIcon.imageset/Contents.json @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "FeelsAppIcon.png", + "filename" : "ReflectAppIcon.png", "idiom" : "universal", "scale" : "1x" }, diff --git a/Shared/Assets.xcassets/FeelsAppIcon.imageset/FeelsAppIcon.png b/Shared/Assets.xcassets/ReflectAppIcon.imageset/ReflectAppIcon.png similarity index 100% rename from Shared/Assets.xcassets/FeelsAppIcon.imageset/FeelsAppIcon.png rename to Shared/Assets.xcassets/ReflectAppIcon.imageset/ReflectAppIcon.png diff --git a/Shared/BGTask.swift b/Shared/BGTask.swift index 1d72e34..78a5191 100644 --- a/Shared/BGTask.swift +++ b/Shared/BGTask.swift @@ -1,6 +1,6 @@ // // BGTask.swift -// Feels (iOS) +// Reflect (iOS) // // Created by Trey Tartt on 1/12/22. // @@ -9,7 +9,7 @@ import Foundation import BackgroundTasks class BGTask { - static let updateDBMissingID = "com.tt.feels.dbUpdateMissing" + static let updateDBMissingID = "com.88oakapps.reflect.dbUpdateMissing" @MainActor class func runFillInMissingDatesTask(task: BGProcessingTask) { diff --git a/Shared/Date+Extensions.swift b/Shared/Date+Extensions.swift index a2923b6..ef26b0e 100644 --- a/Shared/Date+Extensions.swift +++ b/Shared/Date+Extensions.swift @@ -1,6 +1,6 @@ // // Date+Extensions.swift -// Feels (iOS) +// Reflect (iOS) // // Created by Trey Tartt on 2/19/22. // diff --git a/Shared/DemoAnimationManager.swift b/Shared/DemoAnimationManager.swift index f373256..d2d05de 100644 --- a/Shared/DemoAnimationManager.swift +++ b/Shared/DemoAnimationManager.swift @@ -1,6 +1,6 @@ // // DemoAnimationManager.swift -// Feels +// Reflect // // Manages demo animation mode for promotional videos. // Animates filling mood entries from top-left to bottom-right. diff --git a/Shared/GoogleService-Info.plist b/Shared/GoogleService-Info.plist index 4453b48..6df8a65 100644 --- a/Shared/GoogleService-Info.plist +++ b/Shared/GoogleService-Info.plist @@ -15,9 +15,9 @@ BUNDLE_ID com.tt.ifeel PROJECT_ID - ifeels + ireflect STORAGE_BUCKET - ifeels.appspot.com + ireflect.appspot.com IS_ADS_ENABLED IS_ANALYTICS_ENABLED diff --git a/Shared/HealthKitManager.swift b/Shared/HealthKitManager.swift index 6fef7b4..817bf9b 100644 --- a/Shared/HealthKitManager.swift +++ b/Shared/HealthKitManager.swift @@ -1,6 +1,6 @@ // // HealthKitManager.swift -// Feels +// Reflect // // HealthKit State of Mind API integration for syncing mood data with Apple Health // @@ -14,7 +14,7 @@ class HealthKitManager: ObservableObject { static let shared = HealthKitManager() private let healthStore = HKHealthStore() - private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "com.tt.feels", category: "HealthKit") + private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "com.88oakapps.reflect", category: "HealthKit") @Published var isAuthorized = false @Published var authorizationError: Error? @@ -132,7 +132,7 @@ class HealthKitManager: ObservableObject { throw HealthKitError.notAuthorized } - // Convert Feels mood to HealthKit valence (-1 to 1 scale) + // Convert Reflect mood to HealthKit valence (-1 to 1 scale) let valence = moodToValence(mood) // Create State of Mind sample @@ -384,7 +384,7 @@ class HealthKitManager: ObservableObject { // MARK: - Conversion Helpers - /// Convert Feels Mood to HealthKit valence (-1 to 1) + /// Convert Reflect Mood to HealthKit valence (-1 to 1) private func moodToValence(_ mood: Mood) -> Double { switch mood { case .horrible: return -1.0 @@ -396,7 +396,7 @@ class HealthKitManager: ObservableObject { } } - /// Convert HealthKit valence to Feels Mood + /// Convert HealthKit valence to Reflect Mood func valenceToMood(_ valence: Double) -> Mood { switch valence { case ..<(-0.75): return .horrible diff --git a/Shared/IAPManager.swift b/Shared/IAPManager.swift index b8debba..6f4bf3e 100644 --- a/Shared/IAPManager.swift +++ b/Shared/IAPManager.swift @@ -1,6 +1,6 @@ // // IAPManager.swift -// Feels +// Reflect // // Refactored StoreKit 2 subscription manager with clean state model. // @@ -50,8 +50,8 @@ class IAPManager: ObservableObject { static let subscriptionGroupID = "21914363" private let productIdentifiers: Set = [ - "com.88oakapps.feels.IAP.subscriptions.monthly", - "com.88oakapps.feels.IAP.subscriptions.yearly" + "com.88oakapps.reflect.IAP.subscriptions.monthly", + "com.88oakapps.reflect.IAP.subscriptions.yearly" ] private let trialDays = 30 diff --git a/Shared/LocalNotification.swift b/Shared/LocalNotification.swift index 97c27e2..bfad30d 100644 --- a/Shared/LocalNotification.swift +++ b/Shared/LocalNotification.swift @@ -1,6 +1,6 @@ // // LocalNotification.swift -// Feels +// Reflect // // Created by Trey Tartt on 1/8/22. // diff --git a/Shared/Models/AIInsight.swift b/Shared/Models/AIInsight.swift index 99b21db..d999bd3 100644 --- a/Shared/Models/AIInsight.swift +++ b/Shared/Models/AIInsight.swift @@ -1,6 +1,6 @@ // // AIInsight.swift -// Feels +// Reflect // // Created by Claude Code on 12/13/24. // diff --git a/Shared/Models/AppTheme.swift b/Shared/Models/AppTheme.swift index 936cf53..df18a03 100644 --- a/Shared/Models/AppTheme.swift +++ b/Shared/Models/AppTheme.swift @@ -1,6 +1,6 @@ // // AppTheme.swift -// Feels (iOS) +// Reflect (iOS) // // Created by Claude Code on 12/26/24. // diff --git a/Shared/Models/CustomWidgetStateViewModel.swift b/Shared/Models/CustomWidgetStateViewModel.swift index 5f27ad2..f0ac296 100644 --- a/Shared/Models/CustomWidgetStateViewModel.swift +++ b/Shared/Models/CustomWidgetStateViewModel.swift @@ -1,6 +1,6 @@ // // CustomWidgetStateViewModel.swift -// Feels +// Reflect // // Created by Trey Tartt on 3/31/22. // diff --git a/Shared/Models/DaysFilterClass.swift b/Shared/Models/DaysFilterClass.swift index bc70b61..8cec72b 100644 --- a/Shared/Models/DaysFilterClass.swift +++ b/Shared/Models/DaysFilterClass.swift @@ -1,6 +1,6 @@ // // DaysFilterClass.swift -// Feels +// Reflect // // Created by Trey Tartt on 3/31/22. // diff --git a/Shared/Models/DiamondView.swift b/Shared/Models/DiamondView.swift index 3f642c0..a7b9552 100644 --- a/Shared/Models/DiamondView.swift +++ b/Shared/Models/DiamondView.swift @@ -1,6 +1,6 @@ // // DiamondView.swift -// Feels +// Reflect // // Created by Trey Tartt on 3/20/22. // diff --git a/Shared/Models/Mood.swift b/Shared/Models/Mood.swift index b89ad5d..3b3e4cc 100644 --- a/Shared/Models/Mood.swift +++ b/Shared/Models/Mood.swift @@ -1,6 +1,6 @@ // // Mood.swift -// Feels +// Reflect // // Created by Trey Tartt on 1/5/22. // diff --git a/Shared/Models/MoodEntryModel.swift b/Shared/Models/MoodEntryModel.swift index c585cc0..0eb5479 100644 --- a/Shared/Models/MoodEntryModel.swift +++ b/Shared/Models/MoodEntryModel.swift @@ -1,6 +1,6 @@ // // MoodEntryModel.swift -// Feels +// Reflect // // SwiftData model replacing Core Data MoodEntry // diff --git a/Shared/Models/MoodImagable.swift b/Shared/Models/MoodImagable.swift index f2eb235..a66cf7f 100644 --- a/Shared/Models/MoodImagable.swift +++ b/Shared/Models/MoodImagable.swift @@ -1,6 +1,6 @@ // // MoodImagable.swift -// Feels (iOS) +// Reflect (iOS) // // Created by Trey Tartt on 2/19/22. // diff --git a/Shared/Models/MoodMetrics.swift b/Shared/Models/MoodMetrics.swift index a3cead9..49649be 100644 --- a/Shared/Models/MoodMetrics.swift +++ b/Shared/Models/MoodMetrics.swift @@ -1,6 +1,6 @@ // // MoodMetrics.swift -// Feels +// Reflect // // Created by Trey Tartt on 2/12/22. // diff --git a/Shared/Models/MoodTintable.swift b/Shared/Models/MoodTintable.swift index c2d24a0..ef02883 100644 --- a/Shared/Models/MoodTintable.swift +++ b/Shared/Models/MoodTintable.swift @@ -1,6 +1,6 @@ // // MoodTintable.swift -// Feels (iOS) +// Reflect (iOS) // // Created by Trey Tartt on 2/19/22. // diff --git a/Shared/Models/OnboardingDataDataManager.swift b/Shared/Models/OnboardingDataDataManager.swift index 31f0345..b6b0896 100644 --- a/Shared/Models/OnboardingDataDataManager.swift +++ b/Shared/Models/OnboardingDataDataManager.swift @@ -1,6 +1,6 @@ // // OnboardingDataDataManager.swift -// Feels (iOS) +// Reflect (iOS) // // Created by Trey Tartt on 2/18/22. // diff --git a/Shared/Models/PersonalityPackable.swift b/Shared/Models/PersonalityPackable.swift index c5a7794..2014742 100644 --- a/Shared/Models/PersonalityPackable.swift +++ b/Shared/Models/PersonalityPackable.swift @@ -1,6 +1,6 @@ // // NotificationTitles.swift -// Feels (iOS) +// Reflect (iOS) // // Created by Trey Tartt on 2/19/22. // diff --git a/Shared/Models/Shapes.swift b/Shared/Models/Shapes.swift index 16ecd17..ecc19b4 100644 --- a/Shared/Models/Shapes.swift +++ b/Shared/Models/Shapes.swift @@ -1,6 +1,6 @@ // // Shapes.swift -// Feels +// Reflect // // Created by Trey Tartt on 3/20/22. // diff --git a/Shared/Models/SharingImageModels.swift b/Shared/Models/SharingImageModels.swift index 367038f..63fd8bf 100644 --- a/Shared/Models/SharingImageModels.swift +++ b/Shared/Models/SharingImageModels.swift @@ -1,6 +1,6 @@ // // SharingImageModels.swift -// Feels +// Reflect // // Created by Trey Tartt on 2/24/22. // diff --git a/Shared/Models/Theme.swift b/Shared/Models/Theme.swift index 5ef0211..0bc7a2c 100644 --- a/Shared/Models/Theme.swift +++ b/Shared/Models/Theme.swift @@ -1,6 +1,6 @@ // // theme.currentTheme.swift -// Feels (iOS) +// Reflect (iOS) // // Created by Trey Tartt on 2/4/22. // diff --git a/Shared/Models/UserDefaultsStore.swift b/Shared/Models/UserDefaultsStore.swift index e3d4efd..3b4ade1 100644 --- a/Shared/Models/UserDefaultsStore.swift +++ b/Shared/Models/UserDefaultsStore.swift @@ -1,6 +1,6 @@ // // UserDefaultsStore.swift -// Feels (iOS) +// Reflect (iOS) // // Created by Trey Tartt on 1/22/22. // diff --git a/Shared/MoodEntryFunctions.swift b/Shared/MoodEntryFunctions.swift index 7da8668..1985a44 100644 --- a/Shared/MoodEntryFunctions.swift +++ b/Shared/MoodEntryFunctions.swift @@ -1,6 +1,6 @@ // // MoodEntryFunctions.swift -// Feels (iOS) +// Reflect (iOS) // // Created by Trey Tartt on 2/19/22. // diff --git a/Shared/MoodLogger.swift b/Shared/MoodLogger.swift index 7aeca10..b9c1d92 100644 --- a/Shared/MoodLogger.swift +++ b/Shared/MoodLogger.swift @@ -1,6 +1,6 @@ // // MoodLogger.swift -// Feels +// Reflect // // Centralized mood logging service that handles all side effects // @@ -15,7 +15,7 @@ import os.log final class MoodLogger { static let shared = MoodLogger() - private static let logger = Logger(subsystem: "com.tt.feels", category: "MoodLogger") + private static let logger = Logger(subsystem: "com.88oakapps.reflect", category: "MoodLogger") /// Key for tracking the last date side effects were applied private static let lastSideEffectsDateKey = "lastSideEffectsAppliedDate" @@ -86,8 +86,8 @@ final class MoodLogger { // 4. Update tips parameters if requested if updateTips { - FeelsTipsManager.shared.onMoodLogged() - FeelsTipsManager.shared.updateStreak(streak) + ReflectTipsManager.shared.onMoodLogged() + ReflectTipsManager.shared.updateStreak(streak) } // 5. Request app review at moments of delight diff --git a/Shared/MoodStreakActivity.swift b/Shared/MoodStreakActivity.swift index d150bd1..c5d19ae 100644 --- a/Shared/MoodStreakActivity.swift +++ b/Shared/MoodStreakActivity.swift @@ -1,6 +1,6 @@ // // MoodStreakActivity.swift -// Feels +// Reflect // // Live Activity for mood streak tracking on Lock Screen and Dynamic Island // diff --git a/Shared/Onboarding/OnboardingData.swift b/Shared/Onboarding/OnboardingData.swift index 87b815c..99844d1 100644 --- a/Shared/Onboarding/OnboardingData.swift +++ b/Shared/Onboarding/OnboardingData.swift @@ -1,6 +1,6 @@ // // OnboardingData.swift -// Feels (iOS) +// Reflect (iOS) // // Created by Trey Tartt on 1/22/22. // diff --git a/Shared/Onboarding/views/OnboardingCustomizeOne.swift b/Shared/Onboarding/views/OnboardingCustomizeOne.swift index 1ae537c..602fc22 100644 --- a/Shared/Onboarding/views/OnboardingCustomizeOne.swift +++ b/Shared/Onboarding/views/OnboardingCustomizeOne.swift @@ -1,6 +1,6 @@ // // OnboardingCustomizeOne.swift -// Feels (iOS) +// Reflect (iOS) // // Created by Trey Tartt on 4/5/22. // diff --git a/Shared/Onboarding/views/OnboardingCustomizeTwo.swift b/Shared/Onboarding/views/OnboardingCustomizeTwo.swift index 5a99d90..310e942 100644 --- a/Shared/Onboarding/views/OnboardingCustomizeTwo.swift +++ b/Shared/Onboarding/views/OnboardingCustomizeTwo.swift @@ -1,6 +1,6 @@ // // OnboardingCustomizeTwo.swift -// Feels (iOS) +// Reflect (iOS) // // Created by Trey Tartt on 4/5/22. // diff --git a/Shared/Onboarding/views/OnboardingDay.swift b/Shared/Onboarding/views/OnboardingDay.swift index 0b92a0b..87fa22f 100644 --- a/Shared/Onboarding/views/OnboardingDay.swift +++ b/Shared/Onboarding/views/OnboardingDay.swift @@ -1,6 +1,6 @@ // // OnboardingDay.swift -// Feels (iOS) +// Reflect (iOS) // // Created by Trey Tartt on 1/20/22. // diff --git a/Shared/Onboarding/views/OnboardingMain.swift b/Shared/Onboarding/views/OnboardingMain.swift index c1c59f7..5788412 100644 --- a/Shared/Onboarding/views/OnboardingMain.swift +++ b/Shared/Onboarding/views/OnboardingMain.swift @@ -1,6 +1,6 @@ // // OnboardingMain.swift -// Feels (iOS) +// Reflect (iOS) // // Created by Trey Tartt on 1/20/22. // diff --git a/Shared/Onboarding/views/OnboardingStyle.swift b/Shared/Onboarding/views/OnboardingStyle.swift index f5f376d..6620d49 100644 --- a/Shared/Onboarding/views/OnboardingStyle.swift +++ b/Shared/Onboarding/views/OnboardingStyle.swift @@ -1,6 +1,6 @@ // // OnboardingStyle.swift -// Feels +// Reflect // // Created by Claude Code on 12/10/24. // diff --git a/Shared/Onboarding/views/OnboardingSubscription.swift b/Shared/Onboarding/views/OnboardingSubscription.swift index 6360cb0..6627b8e 100644 --- a/Shared/Onboarding/views/OnboardingSubscription.swift +++ b/Shared/Onboarding/views/OnboardingSubscription.swift @@ -1,6 +1,6 @@ // // OnboardingSubscription.swift -// Feels +// Reflect // // Created by Claude Code on 12/10/24. // @@ -143,7 +143,7 @@ struct OnboardingSubscription: View { AnalyticsManager.shared.track(.onboardingCompleted(dayId: nil)) completionClosure(onboardingData) }) { - FeelsSubscriptionStoreView(source: "onboarding") + ReflectSubscriptionStoreView(source: "onboarding") } } } diff --git a/Shared/Onboarding/views/OnboardingTime.swift b/Shared/Onboarding/views/OnboardingTime.swift index bef0bdc..47e5249 100644 --- a/Shared/Onboarding/views/OnboardingTime.swift +++ b/Shared/Onboarding/views/OnboardingTime.swift @@ -1,6 +1,6 @@ // // OnboardingTime.swift -// Feels (iOS) +// Reflect (iOS) // // Created by Trey Tartt on 1/20/22. // diff --git a/Shared/Onboarding/views/OnboardingTitle.swift b/Shared/Onboarding/views/OnboardingTitle.swift index b86041d..959a5ff 100644 --- a/Shared/Onboarding/views/OnboardingTitle.swift +++ b/Shared/Onboarding/views/OnboardingTitle.swift @@ -1,6 +1,6 @@ // // OnboardingTitle.swift -// Feels (iOS) +// Reflect (iOS) // // Created by Trey Tartt on 1/20/22. // diff --git a/Shared/Onboarding/views/OnboardingWelcome.swift b/Shared/Onboarding/views/OnboardingWelcome.swift index 1e36e2e..82676cf 100644 --- a/Shared/Onboarding/views/OnboardingWelcome.swift +++ b/Shared/Onboarding/views/OnboardingWelcome.swift @@ -1,6 +1,6 @@ // // OnboardingWelcome.swift -// Feels +// Reflect // // Created by Claude Code on 12/10/24. // @@ -38,7 +38,7 @@ struct OnboardingWelcome: View { .padding(.bottom, 40) // Title - Text("Welcome to Feels") + Text("Welcome to Reflect") .font(.largeTitle.weight(.bold)) .foregroundColor(.white) .padding(.bottom, 12) diff --git a/Shared/Onboarding/views/OnboardingWrapup.swift b/Shared/Onboarding/views/OnboardingWrapup.swift index 93f1e10..02dfe9b 100644 --- a/Shared/Onboarding/views/OnboardingWrapup.swift +++ b/Shared/Onboarding/views/OnboardingWrapup.swift @@ -1,6 +1,6 @@ // // OnboardingWrapup.swift -// Feels (iOS) +// Reflect (iOS) // // Created by Trey Tartt on 1/21/22. // diff --git a/Shared/Persisence/DataController.swift b/Shared/Persisence/DataController.swift index 250dcae..8152310 100644 --- a/Shared/Persisence/DataController.swift +++ b/Shared/Persisence/DataController.swift @@ -1,6 +1,6 @@ // // DataController.swift -// Feels +// Reflect // // SwiftData controller replacing Core Data PersistenceController. // @@ -11,7 +11,7 @@ import os.log @MainActor final class DataController: ObservableObject { - private static let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "com.tt.feels", category: "DataController") + private static let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "com.88oakapps.reflect", category: "DataController") static let shared = DataController() private(set) var container: ModelContainer diff --git a/Shared/Persisence/DataControllerADD.swift b/Shared/Persisence/DataControllerADD.swift index 82b9497..e475a2b 100644 --- a/Shared/Persisence/DataControllerADD.swift +++ b/Shared/Persisence/DataControllerADD.swift @@ -1,6 +1,6 @@ // // DataControllerADD.swift -// Feels +// Reflect // // SwiftData CREATE operations. // @@ -9,7 +9,7 @@ import SwiftData import Foundation import os.log -private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "com.tt.feels", category: "DataControllerADD") +private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "com.88oakapps.reflect", category: "DataControllerADD") extension DataController { func add(mood: Mood, forDate date: Date, entryType: EntryType) { diff --git a/Shared/Persisence/DataControllerDELETE.swift b/Shared/Persisence/DataControllerDELETE.swift index 7c754de..e6f2b12 100644 --- a/Shared/Persisence/DataControllerDELETE.swift +++ b/Shared/Persisence/DataControllerDELETE.swift @@ -1,6 +1,6 @@ // // DataControllerDELETE.swift -// Feels +// Reflect // // SwiftData DELETE operations. // diff --git a/Shared/Persisence/DataControllerGET.swift b/Shared/Persisence/DataControllerGET.swift index c849fef..6da7706 100644 --- a/Shared/Persisence/DataControllerGET.swift +++ b/Shared/Persisence/DataControllerGET.swift @@ -1,6 +1,6 @@ // // DataControllerGET.swift -// Feels +// Reflect // // SwiftData READ operations. // @@ -9,7 +9,7 @@ import SwiftData import Foundation import os.log -private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "com.tt.feels", category: "DataControllerGET") +private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "com.88oakapps.reflect", category: "DataControllerGET") extension DataController { func getEntry(byDate date: Date) -> MoodEntryModel? { diff --git a/Shared/Persisence/DataControllerHelper.swift b/Shared/Persisence/DataControllerHelper.swift index 60c5161..7c6fe42 100644 --- a/Shared/Persisence/DataControllerHelper.swift +++ b/Shared/Persisence/DataControllerHelper.swift @@ -1,6 +1,6 @@ // // DataControllerHelper.swift -// Feels +// Reflect // // SwiftData helper and test data operations. // diff --git a/Shared/Persisence/DataControllerProtocol.swift b/Shared/Persisence/DataControllerProtocol.swift index e3825a7..9f5659f 100644 --- a/Shared/Persisence/DataControllerProtocol.swift +++ b/Shared/Persisence/DataControllerProtocol.swift @@ -1,6 +1,6 @@ // // DataControllerProtocol.swift -// Feels +// Reflect // // Protocol defining the data access interface for mood entries. // Enables dependency injection and testability. diff --git a/Shared/Persisence/DataControllerUPDATE.swift b/Shared/Persisence/DataControllerUPDATE.swift index 7d7ded2..d0a5427 100644 --- a/Shared/Persisence/DataControllerUPDATE.swift +++ b/Shared/Persisence/DataControllerUPDATE.swift @@ -1,6 +1,6 @@ // // DataControllerUPDATE.swift -// Feels +// Reflect // // SwiftData UPDATE operations. // diff --git a/Shared/Persisence/ExtensionDataProvider.swift b/Shared/Persisence/ExtensionDataProvider.swift index d742c1b..3c8a2fe 100644 --- a/Shared/Persisence/ExtensionDataProvider.swift +++ b/Shared/Persisence/ExtensionDataProvider.swift @@ -1,12 +1,12 @@ // // ExtensionDataProvider.swift -// Feels +// Reflect // // Unified data provider for Widget and Watch extensions. // - Watch: Uses CloudKit for automatic sync with iPhone // - Widget: Uses local App Group storage (widgets can't use CloudKit) // -// Add this file to: FeelsWidgetExtension, Feels Watch App +// Add this file to: ReflectWidgetExtension, Reflect Watch App // import Foundation @@ -22,7 +22,7 @@ final class ExtensionDataProvider { static let shared = ExtensionDataProvider() - private static let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "com.tt.feels", category: "ExtensionDataProvider") + private static let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "com.88oakapps.reflect", category: "ExtensionDataProvider") private var _container: ModelContainer? @@ -47,9 +47,9 @@ final class ExtensionDataProvider { // Watch uses CloudKit for automatic sync with iPhone let cloudKitContainerID: String #if DEBUG - cloudKitContainerID = "iCloud.com.88oakapps.feels.debug" + cloudKitContainerID = "iCloud.com.88oakapps.reflect.debug" #else - cloudKitContainerID = "iCloud.com.88oakapps.feels" + cloudKitContainerID = "iCloud.com.88oakapps.reflect" #endif let configuration = ModelConfiguration( @@ -89,9 +89,9 @@ final class ExtensionDataProvider { throw NSError(domain: "ExtensionDataProvider", code: 1, userInfo: [NSLocalizedDescriptionKey: "App Group not available"]) } #if DEBUG - return containerURL.appendingPathComponent("Feels-Debug.store") + return containerURL.appendingPathComponent("Reflect-Debug.store") #else - return containerURL.appendingPathComponent("Feels.store") + return containerURL.appendingPathComponent("Reflect.store") #endif } diff --git a/Shared/Persisence/SharedModelContainer.swift b/Shared/Persisence/SharedModelContainer.swift index a3fc649..fb466d5 100644 --- a/Shared/Persisence/SharedModelContainer.swift +++ b/Shared/Persisence/SharedModelContainer.swift @@ -1,6 +1,6 @@ // // SharedModelContainer.swift -// Feels +// Reflect // // Factory for creating ModelContainer shared between main app and widget extension. // @@ -25,7 +25,7 @@ enum SharedModelContainerError: LocalizedError { } enum SharedModelContainer { - private static let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "com.tt.feels", category: "SharedModelContainer") + private static let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "com.88oakapps.reflect", category: "SharedModelContainer") /// Indicates whether the app is running with in-memory storage due to a failed App Group container. /// When `true`, all data will be lost on app restart. @@ -116,18 +116,18 @@ enum SharedModelContainer { /// CloudKit container identifier based on build configuration static var cloudKitContainerID: String { #if DEBUG - return "iCloud.com.88oakapps.feels.debug" + return "iCloud.com.88oakapps.reflect.debug" #else - return "iCloud.com.88oakapps.feels" + return "iCloud.com.88oakapps.reflect" #endif } /// Store file name based on build configuration static var storeFileName: String { #if DEBUG - return "Feels-Debug.store" + return "Reflect-Debug.store" #else - return "Feels.store" + return "Reflect.store" #endif } } diff --git a/Shared/Protocols/ChartDataBuildable.swift b/Shared/Protocols/ChartDataBuildable.swift index e41ed6c..c0fd9ab 100644 --- a/Shared/Protocols/ChartDataBuildable.swift +++ b/Shared/Protocols/ChartDataBuildable.swift @@ -1,6 +1,6 @@ // // ChartDataBuildable.swift -// Feels +// Reflect // // Created by Trey Tartt on 1/17/22. // diff --git a/Shared/Protocols/ChartViewItemBuildable.swift b/Shared/Protocols/ChartViewItemBuildable.swift index b7e2f8e..d896ce8 100644 --- a/Shared/Protocols/ChartViewItemBuildable.swift +++ b/Shared/Protocols/ChartViewItemBuildable.swift @@ -1,6 +1,6 @@ // // ChartViewItemBuildable.swift -// Feels +// Reflect // // Created by Trey Tartt on 1/17/22. // diff --git a/Shared/Protocols/SharingTemplate.swift b/Shared/Protocols/SharingTemplate.swift index 334954e..7876c9b 100644 --- a/Shared/Protocols/SharingTemplate.swift +++ b/Shared/Protocols/SharingTemplate.swift @@ -1,6 +1,6 @@ // // SharingTemplate.swift -// Feels (iOS) +// Reflect (iOS) // // Created by Trey Tartt on 2/6/22. // diff --git a/Shared/Random.swift b/Shared/Random.swift index 0608f90..c0cecb1 100644 --- a/Shared/Random.swift +++ b/Shared/Random.swift @@ -1,6 +1,6 @@ // // Random.swift -// Feels +// Reflect // // Created by Trey Tartt on 1/9/22. // @@ -10,8 +10,8 @@ import SwiftUI import SwiftData struct Constants { - static let groupShareId = "group.com.88oakapps.feels" - static let groupShareIdDebug = "group.com.88oakapps.feels.debug" + static let groupShareId = "group.com.88oakapps.reflect" + static let groupShareIdDebug = "group.com.88oakapps.reflect.debug" static var currentGroupShareId: String { #if DEBUG diff --git a/Shared/FeelsApp.swift b/Shared/ReflectApp.swift similarity index 96% rename from Shared/FeelsApp.swift rename to Shared/ReflectApp.swift index 258dd4f..9753619 100644 --- a/Shared/FeelsApp.swift +++ b/Shared/ReflectApp.swift @@ -1,5 +1,5 @@ // -// FeelsApp.swift +// ReflectApp.swift // Shared // // Created by Trey Tartt on 1/5/22. @@ -11,7 +11,7 @@ import BackgroundTasks import WidgetKit @main -struct FeelsApp: App { +struct ReflectApp: App { @Environment(\.scenePhase) private var scenePhase @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate @@ -38,7 +38,7 @@ struct FeelsApp: App { UNUserNotificationCenter.current().setBadgeCount(0) // Reset tips session on app launch - FeelsTipsManager.shared.resetSession() + ReflectTipsManager.shared.resetSession() // Initialize Live Activity scheduler LiveActivityScheduler.shared.scheduleBasedOnCurrentTime() @@ -59,7 +59,7 @@ struct FeelsApp: App { .environmentObject(authManager) .environmentObject(healthKitManager) .sheet(isPresented: $showSubscriptionFromWidget) { - FeelsSubscriptionStoreView(source: "widget_deeplink") + ReflectSubscriptionStoreView(source: "widget_deeplink") .environmentObject(iapManager) } .onOpenURL { url in @@ -147,7 +147,7 @@ struct FeelsApp: App { } private func handleDeepLink(_ url: URL) { - if url.scheme == "feels" && url.host == "subscribe" { + if url.scheme == "reflect" && url.host == "subscribe" { showSubscriptionFromWidget = true } } diff --git a/Shared/FeelsTips.swift b/Shared/ReflectTips.swift similarity index 75% rename from Shared/FeelsTips.swift rename to Shared/ReflectTips.swift index 4cb3bfd..0593801 100644 --- a/Shared/FeelsTips.swift +++ b/Shared/ReflectTips.swift @@ -1,16 +1,16 @@ // -// FeelsTips.swift -// Feels +// ReflectTips.swift +// Reflect // // Custom tips system for feature discovery and onboarding // import SwiftUI -// MARK: - FeelsTip Protocol +// MARK: - ReflectTip Protocol @MainActor -protocol FeelsTip: Identifiable { +protocol ReflectTip: Identifiable { var id: String { get } var title: String { get } var message: String { get } @@ -21,7 +21,7 @@ protocol FeelsTip: Identifiable { // MARK: - Tip Definitions @MainActor -struct CustomizeLayoutTip: FeelsTip { +struct CustomizeLayoutTip: ReflectTip { let id = "customizeLayout" let title = "Personalize Your Experience" let message = "Customize mood icons, colors, and layouts to make the app truly yours." @@ -30,51 +30,51 @@ struct CustomizeLayoutTip: FeelsTip { } @MainActor -struct AIInsightsTip: FeelsTip { +struct AIInsightsTip: ReflectTip { let id = "aiInsights" let title = "Discover AI Insights" let message = "Get personalized insights about your mood patterns powered by Apple Intelligence." let icon = "brain.head.profile" var isEligible: Bool { - FeelsTipsManager.shared.moodLogCount >= 7 + ReflectTipsManager.shared.moodLogCount >= 7 } } @MainActor -struct SiriShortcutTip: FeelsTip { +struct SiriShortcutTip: ReflectTip { let id = "siriShortcut" let title = "Use Siri to Log Moods" - let message = "Say \"Hey Siri, log my mood as great in Feels\" for hands-free logging." + let message = "Say \"Hey Siri, log my mood as great in Reflect\" for hands-free logging." let icon = "mic.fill" var isEligible: Bool { - FeelsTipsManager.shared.moodLogCount >= 3 + ReflectTipsManager.shared.moodLogCount >= 3 } } @MainActor -struct HealthKitSyncTip: FeelsTip { +struct HealthKitSyncTip: ReflectTip { let id = "healthKitSync" let title = "Sync with Apple Health" let message = "Connect to Apple Health to see your mood data alongside sleep, exercise, and more." let icon = "heart.fill" var isEligible: Bool { - FeelsTipsManager.shared.hasSeenSettings + ReflectTipsManager.shared.hasSeenSettings } } @MainActor -struct WidgetVotingTip: FeelsTip { +struct WidgetVotingTip: ReflectTip { let id = "widgetVoting" let title = "Vote from Your Home Screen" let message = "Add the Mood Vote widget to quickly log your mood without opening the app." let icon = "square.grid.2x2.fill" var isEligible: Bool { - FeelsTipsManager.shared.daysUsingApp >= 2 + ReflectTipsManager.shared.daysUsingApp >= 2 } } @MainActor -struct TimeViewTip: FeelsTip { +struct TimeViewTip: ReflectTip { let id = "timeView" let title = "View Your History" let message = "Switch between Day, Month, and Year views to see your mood patterns over time." @@ -83,20 +83,20 @@ struct TimeViewTip: FeelsTip { } @MainActor -struct MoodStreakTip: FeelsTip { +struct MoodStreakTip: ReflectTip { let id = "moodStreak" let title = "Build Your Streak!" let message = "Log your mood daily to build a streak. Consistency helps you understand your patterns." let icon = "flame.fill" var isEligible: Bool { - FeelsTipsManager.shared.currentStreak >= 3 + ReflectTipsManager.shared.currentStreak >= 3 } } // MARK: - All Tips @MainActor -enum FeelsTips { +enum ReflectTips { static let customizeLayout = CustomizeLayoutTip() static let aiInsights = AIInsightsTip() static let siriShortcut = SiriShortcutTip() @@ -109,21 +109,21 @@ enum FeelsTips { // MARK: - Tips Manager @MainActor -class FeelsTipsManager: ObservableObject { - static let shared = FeelsTipsManager() +class ReflectTipsManager: ObservableObject { + static let shared = ReflectTipsManager() // MARK: - Keys private enum Keys { - static let tipsEnabled = "feels.tips.enabled" - static let shownTipIDs = "feels.tips.shownIDs" - static let moodLogCount = "feels.tips.moodLogCount" - static let hasSeenSettings = "feels.tips.hasSeenSettings" - static let daysUsingApp = "feels.tips.daysUsingApp" - static let currentStreak = "feels.tips.currentStreak" + static let tipsEnabled = "reflect.tips.enabled" + static let shownTipIDs = "reflect.tips.shownIDs" + static let moodLogCount = "reflect.tips.moodLogCount" + static let hasSeenSettings = "reflect.tips.hasSeenSettings" + static let daysUsingApp = "reflect.tips.daysUsingApp" + static let currentStreak = "reflect.tips.currentStreak" } // MARK: - Published State - @Published var currentTip: (any FeelsTip)? + @Published var currentTip: (any ReflectTip)? @Published var showTipModal = false // MARK: - Global Toggle (configurable) @@ -178,7 +178,7 @@ class FeelsTipsManager: ObservableObject { // MARK: - Public API /// Check if a tip should be shown - func shouldShowTip(_ tip: any FeelsTip) -> Bool { + func shouldShowTip(_ tip: any ReflectTip) -> Bool { guard tipsEnabled else { return false } guard !hasShownTipThisSession else { return false } guard !shownTipIDs.contains(tip.id) else { return false } @@ -187,14 +187,14 @@ class FeelsTipsManager: ObservableObject { } /// Show a tip if eligible - func showTipIfEligible(_ tip: any FeelsTip) { + func showTipIfEligible(_ tip: any ReflectTip) { guard shouldShowTip(tip) else { return } currentTip = tip showTipModal = true } /// Mark a tip as shown (called when dismissed) - func markTipAsShown(_ tip: any FeelsTip) { + func markTipAsShown(_ tip: any ReflectTip) { shownTipIDs.insert(tip.id) hasShownTipThisSession = true currentTip = nil @@ -237,8 +237,8 @@ class FeelsTipsManager: ObservableObject { // MARK: - View Modifier for Easy Integration -struct FeelsTipModifier: ViewModifier { - let tip: any FeelsTip +struct ReflectTipModifier: ViewModifier { + let tip: any ReflectTip let gradientColors: [Color] // Use local state for sheet to avoid interference from other manager state changes @@ -255,7 +255,7 @@ struct FeelsTipModifier: ViewModifier { // Delay tip presentation to ensure view hierarchy is fully established // This prevents "presenting from detached view controller" errors DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { - if FeelsTipsManager.shared.shouldShowTip(tip) { + if ReflectTipsManager.shared.shouldShowTip(tip) { showSheet = true } } @@ -268,7 +268,7 @@ struct FeelsTipModifier: ViewModifier { gradientColors: gradientColors, onDismiss: { showSheet = false - FeelsTipsManager.shared.markTipAsShown(tip) + ReflectTipsManager.shared.markTipAsShown(tip) } ) .presentationDetents([.height(340)]) @@ -280,8 +280,8 @@ struct FeelsTipModifier: ViewModifier { extension View { /// Attach a tip that shows as a themed modal when eligible - func feelsTip(_ tip: any FeelsTip, gradientColors: [Color]) -> some View { - modifier(FeelsTipModifier(tip: tip, gradientColors: gradientColors)) + func reflectTip(_ tip: any ReflectTip, gradientColors: [Color]) -> some View { + modifier(ReflectTipModifier(tip: tip, gradientColors: gradientColors)) } // MARK: - Convenience Modifiers @@ -292,30 +292,30 @@ extension View { } func customizeLayoutTip() -> some View { - feelsTip(FeelsTips.customizeLayout, gradientColors: [Color(hex: "667eea"), Color(hex: "764ba2")]) + reflectTip(ReflectTips.customizeLayout, gradientColors: [Color(hex: "667eea"), Color(hex: "764ba2")]) } func aiInsightsTip() -> some View { - feelsTip(FeelsTips.aiInsights, gradientColors: [.purple, .blue]) + reflectTip(ReflectTips.aiInsights, gradientColors: [.purple, .blue]) } func siriShortcutTip() -> some View { - feelsTip(FeelsTips.siriShortcut, gradientColors: [Color(hex: "f093fb"), Color(hex: "f5576c")]) + reflectTip(ReflectTips.siriShortcut, gradientColors: [Color(hex: "f093fb"), Color(hex: "f5576c")]) } func healthKitSyncTip() -> some View { - feelsTip(FeelsTips.healthKitSync, gradientColors: [.red, .pink]) + reflectTip(ReflectTips.healthKitSync, gradientColors: [.red, .pink]) } func widgetVotingTip() -> some View { - feelsTip(FeelsTips.widgetVoting, gradientColors: [Color(hex: "11998e"), Color(hex: "38ef7d")]) + reflectTip(ReflectTips.widgetVoting, gradientColors: [Color(hex: "11998e"), Color(hex: "38ef7d")]) } func timeViewTip() -> some View { - feelsTip(FeelsTips.timeView, gradientColors: [.blue, .cyan]) + reflectTip(ReflectTips.timeView, gradientColors: [.blue, .cyan]) } func moodStreakTip() -> some View { - feelsTip(FeelsTips.moodStreak, gradientColors: [.orange, .red]) + reflectTip(ReflectTips.moodStreak, gradientColors: [.orange, .red]) } } diff --git a/Shared/Services/AppLogger.swift b/Shared/Services/AppLogger.swift index 52e130a..3683ae7 100644 --- a/Shared/Services/AppLogger.swift +++ b/Shared/Services/AppLogger.swift @@ -1,6 +1,6 @@ // // AppLogger.swift -// Feels +// Reflect // // Centralized logging using OSLog for production-ready logging. // @@ -29,6 +29,6 @@ enum AppLogger { // MARK: - Private private static var subsystem: String { - Bundle.main.bundleIdentifier ?? "com.tt.feels" + Bundle.main.bundleIdentifier ?? "com.88oakapps.reflect" } } diff --git a/Shared/Services/BiometricAuthManager.swift b/Shared/Services/BiometricAuthManager.swift index 68aefc6..3834f98 100644 --- a/Shared/Services/BiometricAuthManager.swift +++ b/Shared/Services/BiometricAuthManager.swift @@ -1,6 +1,6 @@ // // BiometricAuthManager.swift -// Feels +// Reflect // // Manages Face ID / Touch ID authentication for app privacy lock. // @@ -93,7 +93,7 @@ class BiometricAuthManager: ObservableObject { do { let success = try await context.evaluatePolicy( policy, - localizedReason: "Unlock Feels to access your mood data" + localizedReason: "Unlock Reflect to access your mood data" ) isUnlocked = success @@ -120,7 +120,7 @@ class BiometricAuthManager: ObservableObject { do { let success = try await context.evaluatePolicy( .deviceOwnerAuthentication, - localizedReason: "Unlock Feels to access your mood data" + localizedReason: "Unlock Reflect to access your mood data" ) isUnlocked = success diff --git a/Shared/Services/ExportService.swift b/Shared/Services/ExportService.swift index 139058d..8717335 100644 --- a/Shared/Services/ExportService.swift +++ b/Shared/Services/ExportService.swift @@ -1,6 +1,6 @@ // // ExportService.swift -// Feels +// Reflect // // Handles exporting mood data to CSV and PDF formats with beautiful visualizations. // @@ -76,7 +76,7 @@ class ExportService { func exportCSV(entries: [MoodEntryModel]) -> URL? { let csv = generateCSV(entries: entries) - let filename = "Feels-Export-\(formattedDate()).csv" + let filename = "Reflect-Export-\(formattedDate()).csv" let tempURL = FileManager.default.temporaryDirectory.appendingPathComponent(filename) do { @@ -107,7 +107,7 @@ class ExportService { let contentWidth = pageWidth - (margin * 2) let pdfMetaData = [ - kCGPDFContextCreator: "Feels App", + kCGPDFContextCreator: "Reflect App", kCGPDFContextTitle: title ] @@ -167,7 +167,7 @@ class ExportService { return nil } - let filename = "Feels-Report-\(formattedDate()).pdf" + let filename = "Reflect-Report-\(formattedDate()).pdf" let tempURL = FileManager.default.temporaryDirectory.appendingPathComponent(filename) do { @@ -624,7 +624,7 @@ class ExportService { .font: footerFont, .foregroundColor: UIColor.lightGray ] - let footerString = NSAttributedString(string: "Generated by Feels - Your Mood Tracking Companion", attributes: footerAttributes) + let footerString = NSAttributedString(string: "Generated by Reflect - Your Mood Tracking Companion", attributes: footerAttributes) let footerSize = footerString.size() footerString.draw(at: CGPoint(x: (pageWidth - footerSize.width) / 2, y: footerY)) } diff --git a/Shared/Services/ExportableInsightsViews.swift b/Shared/Services/ExportableInsightsViews.swift index c9e3997..d83c1a5 100644 --- a/Shared/Services/ExportableInsightsViews.swift +++ b/Shared/Services/ExportableInsightsViews.swift @@ -1,6 +1,6 @@ // // ExportableInsightsViews.swift -// Feels +// Reflect // // Exportable insights views with sample AI-generated insights for screenshots. // diff --git a/Shared/Services/ExportableWatchViews.swift b/Shared/Services/ExportableWatchViews.swift index 0382d8d..f8478fa 100644 --- a/Shared/Services/ExportableWatchViews.swift +++ b/Shared/Services/ExportableWatchViews.swift @@ -1,6 +1,6 @@ // // ExportableWatchViews.swift -// Feels +// Reflect // // Exportable watch views that match the real watchOS layouts. // These views accept tint/icon configuration as parameters for batch export. @@ -292,7 +292,7 @@ struct ExportableRectangularComplication: View { .font(.system(size: 24)) VStack(alignment: .leading, spacing: 2) { - Text("Feels") + Text("Reflect") .font(.system(size: 14, weight: .semibold)) Text("Tap to log mood") .font(.system(size: 12)) diff --git a/Shared/Services/ExportableWidgetViews.swift b/Shared/Services/ExportableWidgetViews.swift index 835cb4e..ff6a5a9 100644 --- a/Shared/Services/ExportableWidgetViews.swift +++ b/Shared/Services/ExportableWidgetViews.swift @@ -1,6 +1,6 @@ // // ExportableWidgetViews.swift -// Feels +// Reflect // // Exportable widget views that match the real WidgetKit widgets pixel-for-pixel. // These views accept tint/icon configuration as parameters for batch export. @@ -180,7 +180,7 @@ struct ExportableVotingView: View { } } -// MARK: - Exportable Voted Stats View (matches VotedStatsView from FeelsVoteWidget.swift) +// MARK: - Exportable Voted Stats View (matches VotedStatsView from ReflectVoteWidget.swift) struct ExportableVotedStatsView: View { enum Size { @@ -303,7 +303,7 @@ struct ExportableVotedStatsView: View { } } -// MARK: - Exportable Timeline Small View (matches SmallWidgetView from FeelsTimelineWidget.swift) +// MARK: - Exportable Timeline Small View (matches SmallWidgetView from ReflectTimelineWidget.swift) struct ExportableTimelineSmallView: View { let config: WidgetExportConfig @@ -359,7 +359,7 @@ struct ExportableTimelineSmallView: View { } } -// MARK: - Exportable Timeline Medium View (matches MediumWidgetView from FeelsTimelineWidget.swift) +// MARK: - Exportable Timeline Medium View (matches MediumWidgetView from ReflectTimelineWidget.swift) struct ExportableTimelineMediumView: View { let config: WidgetExportConfig @@ -469,7 +469,7 @@ struct ExportableMediumDayCell: View { } } -// MARK: - Exportable Timeline Large View (matches LargeWidgetView from FeelsTimelineWidget.swift) +// MARK: - Exportable Timeline Large View (matches LargeWidgetView from ReflectTimelineWidget.swift) struct ExportableTimelineLargeView: View { let config: WidgetExportConfig diff --git a/Shared/Services/FoundationModelsInsightService.swift b/Shared/Services/FoundationModelsInsightService.swift index a4ba793..ca0381e 100644 --- a/Shared/Services/FoundationModelsInsightService.swift +++ b/Shared/Services/FoundationModelsInsightService.swift @@ -1,6 +1,6 @@ // // FoundationModelsInsightService.swift -// Feels +// Reflect // // Created by Claude Code on 12/13/24. // @@ -112,7 +112,7 @@ class FoundationModelsInsightService: ObservableObject { private var defaultSystemInstructions: String { """ - You are a supportive mood analyst for the Feels app. Analyze mood data and provide warm, actionable insights. + You are a supportive mood analyst for the Reflect app. Analyze mood data and provide warm, actionable insights. Style: Encouraging, empathetic, concise (1-2 sentences per insight). Reference specific data. diff --git a/Shared/Services/HealthService.swift b/Shared/Services/HealthService.swift index a94fdb1..0bcfa4a 100644 --- a/Shared/Services/HealthService.swift +++ b/Shared/Services/HealthService.swift @@ -1,6 +1,6 @@ // // HealthService.swift -// Feels +// Reflect // // Manages Apple Health integration for mood correlation insights. // diff --git a/Shared/Services/ImageCache.swift b/Shared/Services/ImageCache.swift index 80a4c09..0e03bbf 100644 --- a/Shared/Services/ImageCache.swift +++ b/Shared/Services/ImageCache.swift @@ -1,6 +1,6 @@ // // ImageCache.swift -// Feels +// Reflect // // In-memory image cache for thumbnail images to improve scrolling performance. // @@ -13,7 +13,7 @@ final class ImageCache { static let shared = ImageCache() private let cache = NSCache() - private let queue = DispatchQueue(label: "com.tt.feels.imagecache", qos: .userInitiated) + private let queue = DispatchQueue(label: "com.88oakapps.reflect.imagecache", qos: .userInitiated) private var memoryWarningToken: NSObjectProtocol? diff --git a/Shared/Services/InsightsExporter.swift b/Shared/Services/InsightsExporter.swift index 79df8a4..3fc5f9c 100644 --- a/Shared/Services/InsightsExporter.swift +++ b/Shared/Services/InsightsExporter.swift @@ -1,6 +1,6 @@ // // InsightsExporter.swift -// Feels +// Reflect // // Debug utility to export insights view screenshots with sample AI data. // diff --git a/Shared/Services/MoodDataSummarizer.swift b/Shared/Services/MoodDataSummarizer.swift index be8960b..a60af4d 100644 --- a/Shared/Services/MoodDataSummarizer.swift +++ b/Shared/Services/MoodDataSummarizer.swift @@ -1,6 +1,6 @@ // // MoodDataSummarizer.swift -// Feels +// Reflect // // Created by Claude Code on 12/13/24. // diff --git a/Shared/Services/PhotoManager.swift b/Shared/Services/PhotoManager.swift index d0dabee..86091cd 100644 --- a/Shared/Services/PhotoManager.swift +++ b/Shared/Services/PhotoManager.swift @@ -1,6 +1,6 @@ // // PhotoManager.swift -// Feels +// Reflect // // Manages photo storage for mood entries. // Photos are stored as JPEG files in the app group Documents directory. diff --git a/Shared/Services/ReviewRequestManager.swift b/Shared/Services/ReviewRequestManager.swift index f3e6788..4417f46 100644 --- a/Shared/Services/ReviewRequestManager.swift +++ b/Shared/Services/ReviewRequestManager.swift @@ -1,6 +1,6 @@ // // ReviewRequestManager.swift -// Feels +// Reflect // // Manages in-app review requests using StoreKit. // Follows Apple's guidelines: requests at moments of delight, @@ -28,10 +28,10 @@ final class ReviewRequestManager { // MARK: - UserDefaults Keys private enum Keys: String { - case lastReviewRequestDate = "feels_lastReviewRequestDate" - case totalReviewRequests = "feels_totalReviewRequests" - case totalMoodEntriesLogged = "feels_totalMoodEntriesLogged" - case lastReviewRequestVersion = "feels_lastReviewRequestVersion" + case lastReviewRequestDate = "reflect_lastReviewRequestDate" + case totalReviewRequests = "reflect_totalReviewRequests" + case totalMoodEntriesLogged = "reflect_totalMoodEntriesLogged" + case lastReviewRequestVersion = "reflect_lastReviewRequestVersion" } private init() {} diff --git a/Shared/Services/SharingScreenshotExporter.swift b/Shared/Services/SharingScreenshotExporter.swift index 5f7ca32..ad9675a 100644 --- a/Shared/Services/SharingScreenshotExporter.swift +++ b/Shared/Services/SharingScreenshotExporter.swift @@ -1,6 +1,6 @@ // // SharingScreenshotExporter.swift -// Feels +// Reflect // // Debug utility to export sharing template screenshots. // diff --git a/Shared/Services/WatchConnectivityManager.swift b/Shared/Services/WatchConnectivityManager.swift index 43afc94..1204040 100644 --- a/Shared/Services/WatchConnectivityManager.swift +++ b/Shared/Services/WatchConnectivityManager.swift @@ -1,6 +1,6 @@ // // WatchConnectivityManager.swift -// Feels +// Reflect // // Central coordinator for Watch Connectivity. // Used for immediate UI updates (Live Activity, widget refresh). @@ -18,7 +18,7 @@ final class WatchConnectivityManager: NSObject, ObservableObject { static let shared = WatchConnectivityManager() - private static let logger = Logger(subsystem: "com.tt.feels", category: "WatchConnectivity") + private static let logger = Logger(subsystem: "com.88oakapps.reflect", category: "WatchConnectivity") private var session: WCSession? diff --git a/Shared/Services/WatchExporter.swift b/Shared/Services/WatchExporter.swift index 7f3fc0c..b1d0aed 100644 --- a/Shared/Services/WatchExporter.swift +++ b/Shared/Services/WatchExporter.swift @@ -1,6 +1,6 @@ // // WatchExporter.swift -// Feels +// Reflect // // Debug utility to export all watch view previews to PNG files. // Uses the exportable watch views from ExportableWatchViews.swift. diff --git a/Shared/Services/WidgetExporter.swift b/Shared/Services/WidgetExporter.swift index 01c1455..05ce11c 100644 --- a/Shared/Services/WidgetExporter.swift +++ b/Shared/Services/WidgetExporter.swift @@ -1,6 +1,6 @@ // // WidgetExporter.swift -// Feels +// Reflect // // Debug utility to export all widget previews to PNG files. // Uses the real widget view layouts from ExportableWidgetViews.swift. diff --git a/Shared/SharedMoodIntent.swift b/Shared/SharedMoodIntent.swift index de28be2..65e36ec 100644 --- a/Shared/SharedMoodIntent.swift +++ b/Shared/SharedMoodIntent.swift @@ -1,11 +1,11 @@ // // SharedMoodIntent.swift -// Feels +// Reflect // // Single VoteMoodIntent for all targets. // Main app uses ForegroundContinuableIntent to run widget intents in app process. // -// Add this file to ALL targets: Feels (iOS), FeelsWidgetExtension, Feels Watch App +// Add this file to ALL targets: Reflect (iOS), ReflectWidgetExtension, Reflect Watch App // import AppIntents @@ -72,7 +72,7 @@ extension VoteMoodIntent: ForegroundContinuableIntent {} #if WIDGET_EXTENSION enum WidgetMoodSaver { - private static let logger = Logger(subsystem: "com.tt.feels.widget", category: "WidgetMoodSaver") + private static let logger = Logger(subsystem: "com.88oakapps.reflect.widget", category: "WidgetMoodSaver") private static var cachedContainer: ModelContainer? @MainActor @@ -107,9 +107,9 @@ enum WidgetMoodSaver { } #if DEBUG - let storeURL = containerURL.appendingPathComponent("Feels-Debug.store") + let storeURL = containerURL.appendingPathComponent("Reflect-Debug.store") #else - let storeURL = containerURL.appendingPathComponent("Feels.store") + let storeURL = containerURL.appendingPathComponent("Reflect.store") #endif let config = ModelConfiguration(schema: schema, url: storeURL, cloudKitDatabase: .none) diff --git a/Shared/ShowBasedOnVoteLogics.swift b/Shared/ShowBasedOnVoteLogics.swift index 085ab69..68e74a1 100644 --- a/Shared/ShowBasedOnVoteLogics.swift +++ b/Shared/ShowBasedOnVoteLogics.swift @@ -1,6 +1,6 @@ // // ShowBasedOnVoteLogics.swift -// Feels (iOS) +// Reflect (iOS) // // Created by Trey Tartt on 2/17/22. // diff --git a/Shared/Stats.swift b/Shared/Stats.swift index 8f14b51..ec38a1f 100644 --- a/Shared/Stats.swift +++ b/Shared/Stats.swift @@ -1,6 +1,6 @@ // // Stats.swift -// Feels +// Reflect // // Created by Trey Tartt on 1/14/22. // diff --git a/Shared/UITestMode.swift b/Shared/UITestMode.swift index 3289504..1653689 100644 --- a/Shared/UITestMode.swift +++ b/Shared/UITestMode.swift @@ -1,6 +1,6 @@ // // UITestMode.swift -// Feels (iOS) +// Reflect (iOS) // // Handles launch arguments for UI testing mode. // When --ui-testing is passed, the app uses deterministic settings. @@ -78,7 +78,7 @@ enum UITestMode { #if DEBUG IAPManager.shared.bypassSubscription = bypassSubscription // Reset subscription state to discard stale cached state from previous test runs. - // IAPManager.shared was already initialized (as @StateObject in FeelsApp) before + // IAPManager.shared was already initialized (as @StateObject in ReflectApp) before // configureIfNeeded runs, so it may have restored stale subscription data. IAPManager.shared.resetForTesting() #endif diff --git a/Shared/Utilities/AccessibilityHelpers.swift b/Shared/Utilities/AccessibilityHelpers.swift index 2792601..524e4ae 100644 --- a/Shared/Utilities/AccessibilityHelpers.swift +++ b/Shared/Utilities/AccessibilityHelpers.swift @@ -1,6 +1,6 @@ // // AccessibilityHelpers.swift -// Feels +// Reflect // // Accessibility utilities for supporting VoiceOver, Dynamic Type, and Reduce Motion. // diff --git a/Shared/View+Extensions.swift b/Shared/View+Extensions.swift index 0805257..2827c04 100644 --- a/Shared/View+Extensions.swift +++ b/Shared/View+Extensions.swift @@ -1,6 +1,6 @@ // // View+Extensions.swift -// Feels +// Reflect // // Created by Trey Tartt on 7/7/22. // diff --git a/Shared/Views/AddMoodHeaderView.swift b/Shared/Views/AddMoodHeaderView.swift index ee2cb9e..e9f7b24 100644 --- a/Shared/Views/AddMoodHeaderView.swift +++ b/Shared/Views/AddMoodHeaderView.swift @@ -1,6 +1,6 @@ // // AddMoodHeaderView.swift -// Feels +// Reflect // // Created by Trey Tartt on 1/5/22. // diff --git a/Shared/Views/BGView.swift b/Shared/Views/BGView.swift index 13942d3..b36353b 100644 --- a/Shared/Views/BGView.swift +++ b/Shared/Views/BGView.swift @@ -1,6 +1,6 @@ // // IconView.swift -// Feels (iOS) +// Reflect (iOS) // // Created by Trey Tartt on 1/20/22. // diff --git a/Shared/Views/CelebrationAnimations.swift b/Shared/Views/CelebrationAnimations.swift index 95dfb00..10e3a37 100644 --- a/Shared/Views/CelebrationAnimations.swift +++ b/Shared/Views/CelebrationAnimations.swift @@ -1,6 +1,6 @@ // // CelebrationAnimations.swift -// Feels +// Reflect // // Full-view celebration animations that play after voting. // diff --git a/Shared/Views/CustomIcon/CreateWidgetView.swift b/Shared/Views/CustomIcon/CreateWidgetView.swift index 43c7305..8c2037f 100644 --- a/Shared/Views/CustomIcon/CreateWidgetView.swift +++ b/Shared/Views/CustomIcon/CreateWidgetView.swift @@ -1,6 +1,6 @@ // // CreateIconView.swift -// Feels (iOS) +// Reflect (iOS) // // Created by Trey Tartt on 2/13/22. // diff --git a/Shared/Views/CustomIcon/IconView.swift b/Shared/Views/CustomIcon/IconView.swift index be1af86..dc5ffe0 100644 --- a/Shared/Views/CustomIcon/IconView.swift +++ b/Shared/Views/CustomIcon/IconView.swift @@ -1,6 +1,6 @@ // // IconView.swift -// Feels (iOS) +// Reflect (iOS) // // Created by Trey Tartt on 2/20/22. // diff --git a/Shared/Views/CustomIcon/IconViewModel.swift b/Shared/Views/CustomIcon/IconViewModel.swift index db5feb6..1f9c106 100644 --- a/Shared/Views/CustomIcon/IconViewModel.swift +++ b/Shared/Views/CustomIcon/IconViewModel.swift @@ -1,6 +1,6 @@ // // CustomIcon.swift -// Feels (iOS) +// Reflect (iOS) // // Created by Trey Tartt on 2/20/22. // diff --git a/Shared/Views/CustomWidget/CustomWidgetModel.swift b/Shared/Views/CustomWidget/CustomWidgetModel.swift index 8bf2510..4bcec9b 100644 --- a/Shared/Views/CustomWidget/CustomWidgetModel.swift +++ b/Shared/Views/CustomWidget/CustomWidgetModel.swift @@ -1,6 +1,6 @@ // // CustomIcon.swift -// Feels (iOS) +// Reflect (iOS) // // Created by Trey Tartt on 2/13/22. // diff --git a/Shared/Views/CustomWidget/CustomWidgetView.swift b/Shared/Views/CustomWidget/CustomWidgetView.swift index 30ca9b6..57c5db2 100644 --- a/Shared/Views/CustomWidget/CustomWidgetView.swift +++ b/Shared/Views/CustomWidget/CustomWidgetView.swift @@ -1,6 +1,6 @@ // // IconView.swift -// Feels (iOS) +// Reflect (iOS) // // Created by Trey Tartt on 2/13/22. // diff --git a/Shared/Views/CustomizeView/CustomizeView.swift b/Shared/Views/CustomizeView/CustomizeView.swift index dbefd6f..6a153a8 100644 --- a/Shared/Views/CustomizeView/CustomizeView.swift +++ b/Shared/Views/CustomizeView/CustomizeView.swift @@ -1,6 +1,6 @@ // // CustomizeView.swift -// Feels (iOS) +// Reflect (iOS) // // Created by Trey Tartt on 2/19/22. // @@ -189,7 +189,7 @@ struct CustomizeView: View { AnalyticsManager.shared.trackScreen(.customize) }) .sheet(isPresented: $showSubscriptionStore) { - FeelsSubscriptionStoreView(source: "customize") + ReflectSubscriptionStoreView(source: "customize") } .background( theme.currentTheme.bg diff --git a/Shared/Views/CustomizeView/SubViews/AppThemePickerView.swift b/Shared/Views/CustomizeView/SubViews/AppThemePickerView.swift index 807c38d..023e181 100644 --- a/Shared/Views/CustomizeView/SubViews/AppThemePickerView.swift +++ b/Shared/Views/CustomizeView/SubViews/AppThemePickerView.swift @@ -1,6 +1,6 @@ // // AppThemePickerView.swift -// Feels (iOS) +// Reflect (iOS) // // Created by Claude Code on 12/26/24. // diff --git a/Shared/Views/CustomizeView/SubViews/CustomWigetView.swift b/Shared/Views/CustomizeView/SubViews/CustomWigetView.swift index e9acd8a..a79d4f0 100644 --- a/Shared/Views/CustomizeView/SubViews/CustomWigetView.swift +++ b/Shared/Views/CustomizeView/SubViews/CustomWigetView.swift @@ -1,6 +1,6 @@ // // CustomWigetView.swift -// Feels (iOS) +// Reflect (iOS) // // Created by Trey Tartt on 4/2/22. // diff --git a/Shared/Views/CustomizeView/SubViews/DayFilterPickerView.swift b/Shared/Views/CustomizeView/SubViews/DayFilterPickerView.swift index bb7807c..80a9c0d 100644 --- a/Shared/Views/CustomizeView/SubViews/DayFilterPickerView.swift +++ b/Shared/Views/CustomizeView/SubViews/DayFilterPickerView.swift @@ -1,6 +1,6 @@ // // DayFilterPickerView.swift -// Feels (iOS) +// Reflect (iOS) // // Created by Trey Tartt on 4/2/22. // diff --git a/Shared/Views/CustomizeView/SubViews/IconPickerView.swift b/Shared/Views/CustomizeView/SubViews/IconPickerView.swift index e0af28a..98040f0 100644 --- a/Shared/Views/CustomizeView/SubViews/IconPickerView.swift +++ b/Shared/Views/CustomizeView/SubViews/IconPickerView.swift @@ -1,6 +1,6 @@ // // IconPickerView.swift -// Feels (iOS) +// Reflect (iOS) // // Created by Trey Tartt on 4/2/22. // diff --git a/Shared/Views/CustomizeView/SubViews/ImagePackPickerView.swift b/Shared/Views/CustomizeView/SubViews/ImagePackPickerView.swift index e8a5ef9..e279d5a 100644 --- a/Shared/Views/CustomizeView/SubViews/ImagePackPickerView.swift +++ b/Shared/Views/CustomizeView/SubViews/ImagePackPickerView.swift @@ -1,6 +1,6 @@ // // ImagePackPickerView.swift -// Feels (iOS) +// Reflect (iOS) // // Created by Trey Tartt on 4/2/22. // diff --git a/Shared/Views/CustomizeView/SubViews/PersonalityPackPickerView.swift b/Shared/Views/CustomizeView/SubViews/PersonalityPackPickerView.swift index 0670992..5b60844 100644 --- a/Shared/Views/CustomizeView/SubViews/PersonalityPackPickerView.swift +++ b/Shared/Views/CustomizeView/SubViews/PersonalityPackPickerView.swift @@ -1,6 +1,6 @@ // // PersonalityPackPickerView.swift -// Feels (iOS) +// Reflect (iOS) // // Created by Trey Tartt on 4/2/22. // diff --git a/Shared/Views/CustomizeView/SubViews/ShapePickerView.swift b/Shared/Views/CustomizeView/SubViews/ShapePickerView.swift index 28f1d76..9266249 100644 --- a/Shared/Views/CustomizeView/SubViews/ShapePickerView.swift +++ b/Shared/Views/CustomizeView/SubViews/ShapePickerView.swift @@ -1,6 +1,6 @@ // // ShapePickerView.swift -// Feels (iOS) +// Reflect (iOS) // // Created by Trey Tartt on 4/2/22. // diff --git a/Shared/Views/CustomizeView/SubViews/ThemePickerView.swift b/Shared/Views/CustomizeView/SubViews/ThemePickerView.swift index 8efc30b..6201dd7 100644 --- a/Shared/Views/CustomizeView/SubViews/ThemePickerView.swift +++ b/Shared/Views/CustomizeView/SubViews/ThemePickerView.swift @@ -1,6 +1,6 @@ // // ThemePicker.swift -// Feels (iOS) +// Reflect (iOS) // // Created by Trey Tartt on 4/2/22. // diff --git a/Shared/Views/CustomizeView/SubViews/VotingLayoutPickerView.swift b/Shared/Views/CustomizeView/SubViews/VotingLayoutPickerView.swift index 08c453a..9028354 100644 --- a/Shared/Views/CustomizeView/SubViews/VotingLayoutPickerView.swift +++ b/Shared/Views/CustomizeView/SubViews/VotingLayoutPickerView.swift @@ -1,6 +1,6 @@ // // VotingLayoutPickerView.swift -// Feels (iOS) +// Reflect (iOS) // // Created by Claude Code on 12/9/24. // diff --git a/Shared/Views/DayChartView.swift b/Shared/Views/DayChartView.swift index 88b550c..61edfb1 100644 --- a/Shared/Views/DayChartView.swift +++ b/Shared/Views/DayChartView.swift @@ -1,6 +1,6 @@ // // CircleView.swift -// Feels (iOS) +// Reflect (iOS) // // Created by Trey Tartt on 1/13/22. // diff --git a/Shared/Views/DayView/DayViewViewModel.swift b/Shared/Views/DayView/DayViewViewModel.swift index fca5565..99146a1 100644 --- a/Shared/Views/DayView/DayViewViewModel.swift +++ b/Shared/Views/DayView/DayViewViewModel.swift @@ -1,6 +1,6 @@ // // ContentModeViewModel.swift -// Feels (iOS) +// Reflect (iOS) // // Created by Trey Tartt on 1/20/22. // diff --git a/Shared/Views/EmptyView.swift b/Shared/Views/EmptyView.swift index fc56da1..cf37c54 100644 --- a/Shared/Views/EmptyView.swift +++ b/Shared/Views/EmptyView.swift @@ -1,6 +1,6 @@ // // EmptyView.swift -// Feels (iOS) +// Reflect (iOS) // // Created by Trey Tartt on 2/10/22. // diff --git a/Shared/Views/EntryListView.swift b/Shared/Views/EntryListView.swift index 2ddd9cc..4d2b8e2 100644 --- a/Shared/Views/EntryListView.swift +++ b/Shared/Views/EntryListView.swift @@ -1,6 +1,6 @@ // // EntryListView.swift -// Feels (iOS) +// Reflect (iOS) // // Created by Trey Tartt on 3/6/22. // diff --git a/Shared/Views/ExportView.swift b/Shared/Views/ExportView.swift index cf27b14..c1cf8ad 100644 --- a/Shared/Views/ExportView.swift +++ b/Shared/Views/ExportView.swift @@ -1,6 +1,6 @@ // // ExportView.swift -// Feels +// Reflect // // Export mood data to CSV or PDF formats. // @@ -306,7 +306,7 @@ struct ExportView: View { case .csv: url = ExportService.shared.exportCSV(entries: validEntries) case .pdf: - url = ExportService.shared.exportPDF(entries: validEntries, title: "Feels Mood Report") + url = ExportService.shared.exportPDF(entries: validEntries, title: "Reflect Mood Report") } await MainActor.run { diff --git a/Shared/Views/HeaderPercView.swift b/Shared/Views/HeaderPercView.swift index b7ebee2..0674196 100644 --- a/Shared/Views/HeaderPercView.swift +++ b/Shared/Views/HeaderPercView.swift @@ -1,6 +1,6 @@ // // HeaderPercView.swift -// Feels (iOS) +// Reflect (iOS) // // Created by Trey Tartt on 1/29/22. // diff --git a/Shared/Views/HeaderStatsView.swift b/Shared/Views/HeaderStatsView.swift index 14e626d..e9e0f11 100644 --- a/Shared/Views/HeaderStatsView.swift +++ b/Shared/Views/HeaderStatsView.swift @@ -1,6 +1,6 @@ // // HeaderStatsView.swift -// Feels +// Reflect // // Created by Trey Tartt on 1/8/22. // diff --git a/Shared/Views/IAPWarningView.swift b/Shared/Views/IAPWarningView.swift index cc59923..f716ddc 100644 --- a/Shared/Views/IAPWarningView.swift +++ b/Shared/Views/IAPWarningView.swift @@ -1,6 +1,6 @@ // // IAPWarningView.swift -// Feels +// Reflect // // Trial warning banner shown at bottom of Month/Year views. // @@ -53,7 +53,7 @@ struct IAPWarningView: View { .padding() .background(theme.currentTheme.secondaryBGColor) .sheet(isPresented: $showSubscriptionStore) { - FeelsSubscriptionStoreView(source: "iap_warning") + ReflectSubscriptionStoreView(source: "iap_warning") } } } diff --git a/Shared/Views/ImagePickerGridView.swift b/Shared/Views/ImagePickerGridView.swift index e99b448..ff30a0e 100644 --- a/Shared/Views/ImagePickerGridView.swift +++ b/Shared/Views/ImagePickerGridView.swift @@ -1,6 +1,6 @@ // // ImagePickerGrid.swift -// Feels (iOS) +// Reflect (iOS) // // Created by Trey Tartt on 3/12/22. // diff --git a/Shared/Views/InsightsView/InsightsView.swift b/Shared/Views/InsightsView/InsightsView.swift index 4f8c085..96a4c6a 100644 --- a/Shared/Views/InsightsView/InsightsView.swift +++ b/Shared/Views/InsightsView/InsightsView.swift @@ -1,6 +1,6 @@ // // InsightsView.swift -// Feels +// Reflect // // Created by Claude Code on 12/9/24. // @@ -176,7 +176,7 @@ struct InsightsView: View { } } .sheet(isPresented: $showSubscriptionStore) { - FeelsSubscriptionStoreView(source: "insights_gate") + ReflectSubscriptionStoreView(source: "insights_gate") } .background( theme.currentTheme.bg diff --git a/Shared/Views/InsightsView/InsightsViewModel.swift b/Shared/Views/InsightsView/InsightsViewModel.swift index 03dffce..2ae9a31 100644 --- a/Shared/Views/InsightsView/InsightsViewModel.swift +++ b/Shared/Views/InsightsView/InsightsViewModel.swift @@ -1,6 +1,6 @@ // // InsightsViewModel.swift -// Feels +// Reflect // // Created by Claude Code on 12/9/24. // diff --git a/Shared/Views/LockScreenView.swift b/Shared/Views/LockScreenView.swift index 47228c8..34ebb30 100644 --- a/Shared/Views/LockScreenView.swift +++ b/Shared/Views/LockScreenView.swift @@ -1,6 +1,6 @@ // // LockScreenView.swift -// Feels +// Reflect // // Lock screen shown when privacy lock is enabled and app needs authentication. // Supports multiple themed styles that match app themes. diff --git a/Shared/Views/MainTabView.swift b/Shared/Views/MainTabView.swift index 9a00585..816dfc5 100644 --- a/Shared/Views/MainTabView.swift +++ b/Shared/Views/MainTabView.swift @@ -1,6 +1,6 @@ // // MainTabView.swift -// Feels (iOS) +// Reflect (iOS) // // Created by Trey Tartt on 2/18/22. // diff --git a/Shared/Views/MonthView/MonthDetailView.swift b/Shared/Views/MonthView/MonthDetailView.swift index 5f24f68..55e75c5 100644 --- a/Shared/Views/MonthView/MonthDetailView.swift +++ b/Shared/Views/MonthView/MonthDetailView.swift @@ -1,6 +1,6 @@ // // MonthDetailView.swift -// Feels (iOS) +// Reflect (iOS) // // Created by Trey Tartt on 2/18/22. // diff --git a/Shared/Views/MonthView/MonthView.swift b/Shared/Views/MonthView/MonthView.swift index 6acb153..e3c775b 100644 --- a/Shared/Views/MonthView/MonthView.swift +++ b/Shared/Views/MonthView/MonthView.swift @@ -1,6 +1,6 @@ // // HomeViewTwo.swift -// Feels (iOS) +// Reflect (iOS) // // Created by Trey Tartt on 2/18/22. // @@ -339,7 +339,7 @@ struct MonthView: View { } } .sheet(isPresented: $showSubscriptionStore) { - FeelsSubscriptionStoreView(source: "month_gate") + ReflectSubscriptionStoreView(source: "month_gate") } .onAppear(perform: { AnalyticsManager.shared.trackScreen(.month) diff --git a/Shared/Views/NoteEditorView.swift b/Shared/Views/NoteEditorView.swift index 11ada31..931e594 100644 --- a/Shared/Views/NoteEditorView.swift +++ b/Shared/Views/NoteEditorView.swift @@ -1,6 +1,6 @@ // // NoteEditorView.swift -// Feels +// Reflect // // Editor for adding/editing journal notes on mood entries. // diff --git a/Shared/Views/PhotoPickerView.swift b/Shared/Views/PhotoPickerView.swift index 1ef04fa..7013080 100644 --- a/Shared/Views/PhotoPickerView.swift +++ b/Shared/Views/PhotoPickerView.swift @@ -1,6 +1,6 @@ // // PhotoPickerView.swift -// Feels +// Reflect // // Photo picker and gallery for mood entry attachments. // diff --git a/Shared/Views/PurchaseButtonView.swift b/Shared/Views/PurchaseButtonView.swift index a9c6a02..1e7edf7 100644 --- a/Shared/Views/PurchaseButtonView.swift +++ b/Shared/Views/PurchaseButtonView.swift @@ -1,6 +1,6 @@ // // PurchaseButtonView.swift -// Feels +// Reflect // // Subscription status and purchase view for settings. // @@ -32,7 +32,7 @@ struct PurchaseButtonView: View { .background(theme.currentTheme.secondaryBGColor) .cornerRadius(10) .sheet(isPresented: $showSubscriptionStore) { - FeelsSubscriptionStoreView(source: "purchase_button") + ReflectSubscriptionStoreView(source: "purchase_button") } .manageSubscriptionsSheet(isPresented: $showManageSubscriptions) } diff --git a/Shared/Views/FeelsSubscriptionStoreView.swift b/Shared/Views/ReflectSubscriptionStoreView.swift similarity index 99% rename from Shared/Views/FeelsSubscriptionStoreView.swift rename to Shared/Views/ReflectSubscriptionStoreView.swift index d1e7dc4..1f03b20 100644 --- a/Shared/Views/FeelsSubscriptionStoreView.swift +++ b/Shared/Views/ReflectSubscriptionStoreView.swift @@ -1,6 +1,6 @@ // -// FeelsSubscriptionStoreView.swift -// Feels +// ReflectSubscriptionStoreView.swift +// Reflect // // Premium subscription experience with multiple theme options. // @@ -8,7 +8,7 @@ import SwiftUI import StoreKit -struct FeelsSubscriptionStoreView: View { +struct ReflectSubscriptionStoreView: View { @Environment(\.dismiss) private var dismiss @EnvironmentObject var iapManager: IAPManager @@ -478,7 +478,7 @@ struct EditorialMarketingContent: View { .tracking(8) .foregroundColor(Color(red: 0.4, green: 0.4, blue: 0.45)) - Text("FEELS") + Text("REFLECT") .font(.system(size: 52, weight: .bold, design: .serif)) .tracking(2) .foregroundColor(Color(red: 0.15, green: 0.15, blue: 0.2)) @@ -1761,7 +1761,7 @@ struct CassetteTapeView: View { } // Label - Text("FEELS MIXTAPE") + Text("REFLECT MIXTAPE") .font(.system(size: 8, weight: .bold, design: .monospaced)) .foregroundColor(Color(red: 0.9, green: 0.8, blue: 0.6)) .offset(y: 32) @@ -2373,25 +2373,25 @@ struct SocialProofBadge: View { // MARK: - Preview #Preview("Celestial") { - FeelsSubscriptionStoreView(style: .celestial) + ReflectSubscriptionStoreView(style: .celestial) .environmentObject(IAPManager()) .preferredColorScheme(.dark) } #Preview("Garden") { - FeelsSubscriptionStoreView(style: .garden) + ReflectSubscriptionStoreView(style: .garden) .environmentObject(IAPManager()) .preferredColorScheme(.dark) } #Preview("Neon") { - FeelsSubscriptionStoreView(style: .neon) + ReflectSubscriptionStoreView(style: .neon) .environmentObject(IAPManager()) .preferredColorScheme(.dark) } #Preview("Minimal") { - FeelsSubscriptionStoreView(style: .minimal) + ReflectSubscriptionStoreView(style: .minimal) .environmentObject(IAPManager()) .preferredColorScheme(.light) } diff --git a/Shared/Views/SampleEntryView.swift b/Shared/Views/SampleEntryView.swift index d7fa572..73b5e2a 100644 --- a/Shared/Views/SampleEntryView.swift +++ b/Shared/Views/SampleEntryView.swift @@ -1,6 +1,6 @@ // // SampleEntryView.swift -// Feels (iOS) +// Reflect (iOS) // // Created by Trey Tartt on 4/5/22. // diff --git a/Shared/Views/SettingsView/DebugAnimationSettingsView.swift b/Shared/Views/SettingsView/DebugAnimationSettingsView.swift index 5d2ce71..4e9dfb6 100644 --- a/Shared/Views/SettingsView/DebugAnimationSettingsView.swift +++ b/Shared/Views/SettingsView/DebugAnimationSettingsView.swift @@ -1,6 +1,6 @@ // // DebugAnimationSettingsView.swift -// Feels +// Reflect // // Debug-only view for experimenting with vote celebration animations. // diff --git a/Shared/Views/SettingsView/LiveActivityPreviewView.swift b/Shared/Views/SettingsView/LiveActivityPreviewView.swift index 5431577..67457f3 100644 --- a/Shared/Views/SettingsView/LiveActivityPreviewView.swift +++ b/Shared/Views/SettingsView/LiveActivityPreviewView.swift @@ -1,6 +1,6 @@ // // LiveActivityPreviewView.swift -// Feels +// Reflect // // Preview Live Activity with animated streak counter for promotional videos. // diff --git a/Shared/Views/SettingsView/PaywallPreviewSettingsView.swift b/Shared/Views/SettingsView/PaywallPreviewSettingsView.swift index d9bfc1c..0097714 100644 --- a/Shared/Views/SettingsView/PaywallPreviewSettingsView.swift +++ b/Shared/Views/SettingsView/PaywallPreviewSettingsView.swift @@ -1,6 +1,6 @@ // // PaywallPreviewSettingsView.swift -// Feels +// Reflect // // Debug view for previewing and switching paywall styles. // @@ -38,7 +38,7 @@ struct PaywallPreviewSettingsView: View { } } .sheet(isPresented: $showFullPreview) { - FeelsSubscriptionStoreView(source: "paywall_preview", style: selectedStyle) + ReflectSubscriptionStoreView(source: "paywall_preview", style: selectedStyle) .environmentObject(iapManager) } } diff --git a/Shared/Views/SettingsView/SettingsTabView.swift b/Shared/Views/SettingsView/SettingsTabView.swift index 6a9bc63..20fc229 100644 --- a/Shared/Views/SettingsView/SettingsTabView.swift +++ b/Shared/Views/SettingsView/SettingsTabView.swift @@ -1,6 +1,6 @@ // // SettingsTabView.swift -// Feels (iOS) +// Reflect (iOS) // // Created by Trey Tartt on 12/13/25. // @@ -76,7 +76,7 @@ struct SettingsTabView: View { WhyUpgradeView() } .sheet(isPresented: $showSubscriptionStore) { - FeelsSubscriptionStoreView(source: "settings_tab") + ReflectSubscriptionStoreView(source: "settings_tab") .environmentObject(iapManager) } } diff --git a/Shared/Views/SettingsView/SettingsView.swift b/Shared/Views/SettingsView/SettingsView.swift index 9699480..8a3cbef 100644 --- a/Shared/Views/SettingsView/SettingsView.swift +++ b/Shared/Views/SettingsView/SettingsView.swift @@ -1,6 +1,6 @@ // // SettingsView.swift -// Feels +// Reflect // // Created by Trey Tartt on 1/8/22. // @@ -109,7 +109,7 @@ struct SettingsContentView: View { } .onAppear(perform: { AnalyticsManager.shared.trackScreen(.settings) - FeelsTipsManager.shared.onSettingsViewed() + ReflectTipsManager.shared.onSettingsViewed() }) } @@ -953,7 +953,7 @@ struct SettingsContentView: View { .cornerRadius(Constants.viewsCornerRaidus, corners: [.topLeft, .topRight, .bottomLeft, .bottomRight]) .healthKitSyncTip() .sheet(isPresented: $showSubscriptionStore) { - FeelsSubscriptionStoreView(source: "settings") + ReflectSubscriptionStoreView(source: "settings") } } @@ -1078,7 +1078,7 @@ struct SettingsContentView: View { Text("Share Analytics") .foregroundColor(textColor) - Text("Help improve Feels by sharing anonymous usage data") + Text("Help improve Reflect by sharing anonymous usage data") .font(.caption) .foregroundStyle(.secondary) } @@ -1520,7 +1520,7 @@ struct SettingsView: View { .background(theme.currentTheme.secondaryBGColor) .cornerRadius(Constants.viewsCornerRaidus, corners: [.topLeft, .topRight, .bottomLeft, .bottomRight]) .sheet(isPresented: $showSubscriptionStore) { - FeelsSubscriptionStoreView(source: "settings") + ReflectSubscriptionStoreView(source: "settings") } } @@ -1795,7 +1795,7 @@ struct SettingsView: View { Text("Share Analytics") .foregroundColor(textColor) - Text("Help improve Feels by sharing anonymous usage data") + Text("Help improve Reflect by sharing anonymous usage data") .font(.caption) .foregroundStyle(.secondary) } diff --git a/Shared/Views/Sharing/SharingListView.swift b/Shared/Views/Sharing/SharingListView.swift index 7a10744..a1a710a 100644 --- a/Shared/Views/Sharing/SharingListView.swift +++ b/Shared/Views/Sharing/SharingListView.swift @@ -1,6 +1,6 @@ // // SharingView.swift -// Feels (iOS) +// Reflect (iOS) // // Created by Trey Tartt on 2/6/22. // diff --git a/Shared/Views/Sharing/SharingStylePickerView.swift b/Shared/Views/Sharing/SharingStylePickerView.swift index 522e413..9e5a2d1 100644 --- a/Shared/Views/Sharing/SharingStylePickerView.swift +++ b/Shared/Views/Sharing/SharingStylePickerView.swift @@ -1,6 +1,6 @@ // // SharingStylePickerView.swift -// Feels +// Reflect // // A horizontal pager that lets users swipe between design variations // for a sharing template, then export the selected design. diff --git a/Shared/Views/SharingTemplates/AllMoodsTotalTemplate.swift b/Shared/Views/SharingTemplates/AllMoodsTotalTemplate.swift index 1a91ecc..15c3b65 100644 --- a/Shared/Views/SharingTemplates/AllMoodsTotalTemplate.swift +++ b/Shared/Views/SharingTemplates/AllMoodsTotalTemplate.swift @@ -1,6 +1,6 @@ // // AllMoods.swift -// Feels (iOS) +// Reflect (iOS) // // Created by Trey Tartt on 2/6/22. // diff --git a/Shared/Views/SharingTemplates/CurrentStreakTemplate.swift b/Shared/Views/SharingTemplates/CurrentStreakTemplate.swift index 14ee72e..33a77f2 100644 --- a/Shared/Views/SharingTemplates/CurrentStreakTemplate.swift +++ b/Shared/Views/SharingTemplates/CurrentStreakTemplate.swift @@ -1,6 +1,6 @@ // // CurrentStreakTemplate.swift -// Feels (iOS) +// Reflect (iOS) // // Created by Trey Tartt on 2/9/22. // diff --git a/Shared/Views/SharingTemplates/LongestStreakTemplate.swift b/Shared/Views/SharingTemplates/LongestStreakTemplate.swift index 335f39a..a2859b0 100644 --- a/Shared/Views/SharingTemplates/LongestStreakTemplate.swift +++ b/Shared/Views/SharingTemplates/LongestStreakTemplate.swift @@ -1,6 +1,6 @@ // // AllMoods.swift -// Feels (iOS) +// Reflect (iOS) // // Created by Trey Tartt on 2/6/22. // diff --git a/Shared/Views/SharingTemplates/MonthTotalTemplate.swift b/Shared/Views/SharingTemplates/MonthTotalTemplate.swift index 5e07e1a..7022f25 100644 --- a/Shared/Views/SharingTemplates/MonthTotalTemplate.swift +++ b/Shared/Views/SharingTemplates/MonthTotalTemplate.swift @@ -1,6 +1,6 @@ // // MonthTotalTemplate.swift -// Feels (iOS) +// Reflect (iOS) // // Created by Trey Tartt on 2/9/22. // diff --git a/Shared/Views/SharingTemplates/Variations/AllMoodsVariations.swift b/Shared/Views/SharingTemplates/Variations/AllMoodsVariations.swift index 11cd6fc..25fd894 100644 --- a/Shared/Views/SharingTemplates/Variations/AllMoodsVariations.swift +++ b/Shared/Views/SharingTemplates/Variations/AllMoodsVariations.swift @@ -1,6 +1,6 @@ // // AllMoodsVariations.swift -// Feels +// Reflect // // 3 design variations for the All Moods Total sharing template. // @@ -106,13 +106,13 @@ struct AllMoodsV2: View { Spacer().frame(height: 50) VStack(spacing: 10) { - Image("FeelsAppIcon") + Image("ReflectAppIcon") .resizable() .aspectRatio(contentMode: .fit) .frame(width: 96, height: 96) .clipShape(RoundedRectangle(cornerRadius: 22)) - Text("Feels") + Text("Reflect") .font(.system(size: 28, weight: .semibold, design: .rounded)) .foregroundColor(Color(hex: "8B5E3C").opacity(0.4)) } @@ -192,13 +192,13 @@ struct AllMoodsV5: View { Color(hex: "1C1C1E") VStack(spacing: 10) { - Image("FeelsAppIcon") + Image("ReflectAppIcon") .resizable() .aspectRatio(contentMode: .fit) .frame(width: 96, height: 96) .clipShape(RoundedRectangle(cornerRadius: 22)) - Text("Feels") + Text("Reflect") .font(.system(size: 28, weight: .bold, design: .rounded)) .foregroundColor(.white.opacity(0.3)) } diff --git a/Shared/Views/SharingTemplates/Variations/CurrentStreakVariations.swift b/Shared/Views/SharingTemplates/Variations/CurrentStreakVariations.swift index 3f6007f..167dc67 100644 --- a/Shared/Views/SharingTemplates/Variations/CurrentStreakVariations.swift +++ b/Shared/Views/SharingTemplates/Variations/CurrentStreakVariations.swift @@ -1,6 +1,6 @@ // // CurrentStreakVariations.swift -// Feels +// Reflect // // 2 design variations for the Current Streak (Last 10 Days) sharing template. // @@ -90,13 +90,13 @@ struct CurrentStreakV2: View { Spacer() VStack(spacing: 10) { - Image("FeelsAppIcon") + Image("ReflectAppIcon") .resizable() .aspectRatio(contentMode: .fit) .frame(width: 96, height: 96) .clipShape(RoundedRectangle(cornerRadius: 22)) - Text("Feels") + Text("Reflect") .font(.system(size: 28, weight: .semibold, design: .rounded)) .foregroundColor(Color(hex: "8B5E3C").opacity(0.4)) } @@ -188,13 +188,13 @@ struct CurrentStreakV5: View { // Footer VStack(spacing: 10) { - Image("FeelsAppIcon") + Image("ReflectAppIcon") .resizable() .aspectRatio(contentMode: .fit) .frame(width: 96, height: 96) .clipShape(RoundedRectangle(cornerRadius: 22)) - Text("Feels") + Text("Reflect") .font(.system(size: 28, weight: .bold, design: .rounded)) .foregroundColor(.white.opacity(0.3)) } diff --git a/Shared/Views/SharingTemplates/Variations/LongestStreakVariations.swift b/Shared/Views/SharingTemplates/Variations/LongestStreakVariations.swift index f868d6c..4161b15 100644 --- a/Shared/Views/SharingTemplates/Variations/LongestStreakVariations.swift +++ b/Shared/Views/SharingTemplates/Variations/LongestStreakVariations.swift @@ -1,6 +1,6 @@ // // LongestStreakVariations.swift -// Feels +// Reflect // // 2 design variations for the Longest Streak sharing template. // @@ -111,13 +111,13 @@ struct LongestStreakV2: View { Spacer() VStack(spacing: 6) { - Image("FeelsAppIcon") + Image("ReflectAppIcon") .resizable() .aspectRatio(contentMode: .fit) .frame(width: 72, height: 72) .clipShape(RoundedRectangle(cornerRadius: 16)) - Text("Feels") + Text("Reflect") .font(.system(size: 22, weight: .medium, design: .rounded)) .foregroundColor(Color(hex: "8B5E3C").opacity(0.4)) } @@ -217,13 +217,13 @@ struct LongestStreakV3: View { } VStack(spacing: 6) { - Image("FeelsAppIcon") + Image("ReflectAppIcon") .resizable() .aspectRatio(contentMode: .fit) .frame(width: 72, height: 72) .clipShape(RoundedRectangle(cornerRadius: 16)) - Text("Feels") + Text("Reflect") .font(.system(size: 22, weight: .medium)) .foregroundColor(Color(hex: "3A3A4A")) } diff --git a/Shared/Views/SharingTemplates/Variations/MonthTotalVariations.swift b/Shared/Views/SharingTemplates/Variations/MonthTotalVariations.swift index 3deb837..cf72c1b 100644 --- a/Shared/Views/SharingTemplates/Variations/MonthTotalVariations.swift +++ b/Shared/Views/SharingTemplates/Variations/MonthTotalVariations.swift @@ -1,6 +1,6 @@ // // MonthTotalVariations.swift -// Feels +// Reflect // // 3 design variations for the Month Total sharing template. // @@ -93,13 +93,13 @@ struct MonthTotalV1: View { Spacer() VStack(spacing: 10) { - Image("FeelsAppIcon") + Image("ReflectAppIcon") .resizable() .aspectRatio(contentMode: .fit) .frame(width: 96, height: 96) .clipShape(RoundedRectangle(cornerRadius: 22)) - Text("Feels") + Text("Reflect") .font(.system(size: 28, weight: .medium, design: .rounded)) .foregroundColor(Color(hex: "C7C7CC")) } @@ -200,13 +200,13 @@ struct MonthTotalV5: View { Color(hex: "1C1C1E") VStack(spacing: 10) { - Image("FeelsAppIcon") + Image("ReflectAppIcon") .resizable() .aspectRatio(contentMode: .fit) .frame(width: 96, height: 96) .clipShape(RoundedRectangle(cornerRadius: 22)) - Text("Feels") + Text("Reflect") .font(.system(size: 28, weight: .bold, design: .rounded)) .foregroundColor(.white.opacity(0.3)) } diff --git a/Shared/Views/SharingTemplates/WeekTotalTemplate.swift b/Shared/Views/SharingTemplates/WeekTotalTemplate.swift index f4c65ec..34ad908 100644 --- a/Shared/Views/SharingTemplates/WeekTotalTemplate.swift +++ b/Shared/Views/SharingTemplates/WeekTotalTemplate.swift @@ -1,6 +1,6 @@ // // WeekTotalTemplate.swift -// Feels (iOS) +// Reflect (iOS) // // Created by Trey Tartt on 2/9/22. // diff --git a/Shared/Views/SmallRollUpHeaderView.swift b/Shared/Views/SmallRollUpHeaderView.swift index 30781d1..b8c58da 100644 --- a/Shared/Views/SmallRollUpHeaderView.swift +++ b/Shared/Views/SmallRollUpHeaderView.swift @@ -1,6 +1,6 @@ // // SmallHeaderView.swift -// Feels (iOS) +// Reflect (iOS) // // Created by Trey Tartt on 1/28/22. // diff --git a/Shared/Views/SwitchableView.swift b/Shared/Views/SwitchableView.swift index 0207372..9f4acef 100644 --- a/Shared/Views/SwitchableView.swift +++ b/Shared/Views/SwitchableView.swift @@ -1,6 +1,6 @@ // // SwitchableView.swift -// Feels (iOS) +// Reflect (iOS) // // Created by Trey Tartt on 1/30/22. // diff --git a/Shared/Views/TipModalView.swift b/Shared/Views/TipModalView.swift index ef04751..2d2f776 100644 --- a/Shared/Views/TipModalView.swift +++ b/Shared/Views/TipModalView.swift @@ -1,6 +1,6 @@ // // TipModalView.swift -// Feels +// Reflect // // Custom tip modal that adapts to the user's chosen theme // @@ -250,14 +250,14 @@ struct TipsPreviewView: View { @Environment(\.dismiss) private var dismiss @State private var selectedTipIndex: Int? - private let allTips: [(tip: any FeelsTip, colors: [Color], rule: String)] = [ - (FeelsTips.customizeLayout, [Color(hex: "667eea"), Color(hex: "764ba2")], "Always eligible"), - (FeelsTips.aiInsights, [.purple, .blue], "moodLogCount >= 7"), - (FeelsTips.siriShortcut, [Color(hex: "f093fb"), Color(hex: "f5576c")], "moodLogCount >= 3"), - (FeelsTips.healthKitSync, [.red, .pink], "hasSeenSettings == true"), - (FeelsTips.widgetVoting, [Color(hex: "11998e"), Color(hex: "38ef7d")], "daysUsingApp >= 2"), - (FeelsTips.timeView, [.blue, .cyan], "Always eligible"), - (FeelsTips.moodStreak, [.orange, .red], "currentStreak >= 3") + private let allTips: [(tip: any ReflectTip, colors: [Color], rule: String)] = [ + (ReflectTips.customizeLayout, [Color(hex: "667eea"), Color(hex: "764ba2")], "Always eligible"), + (ReflectTips.aiInsights, [.purple, .blue], "moodLogCount >= 7"), + (ReflectTips.siriShortcut, [Color(hex: "f093fb"), Color(hex: "f5576c")], "moodLogCount >= 3"), + (ReflectTips.healthKitSync, [.red, .pink], "hasSeenSettings == true"), + (ReflectTips.widgetVoting, [Color(hex: "11998e"), Color(hex: "38ef7d")], "daysUsingApp >= 2"), + (ReflectTips.timeView, [.blue, .cyan], "Always eligible"), + (ReflectTips.moodStreak, [.orange, .red], "currentStreak >= 3") ] var body: some View { @@ -317,24 +317,24 @@ struct TipsPreviewView: View { Section { Button("Reset All Tips") { - FeelsTipsManager.shared.resetAllTips() + ReflectTipsManager.shared.resetAllTips() } .foregroundColor(.red) Toggle("Tips Enabled", isOn: Binding( - get: { FeelsTipsManager.shared.tipsEnabled }, - set: { FeelsTipsManager.shared.tipsEnabled = $0 } + get: { ReflectTipsManager.shared.tipsEnabled }, + set: { ReflectTipsManager.shared.tipsEnabled = $0 } )) } header: { Text("Settings") } Section { - LabeledContent("Mood Log Count", value: "\(FeelsTipsManager.shared.moodLogCount)") - LabeledContent("Days Using App", value: "\(FeelsTipsManager.shared.daysUsingApp)") - LabeledContent("Current Streak", value: "\(FeelsTipsManager.shared.currentStreak)") - LabeledContent("Has Seen Settings", value: FeelsTipsManager.shared.hasSeenSettings ? "Yes" : "No") - LabeledContent("Shown This Session", value: FeelsTipsManager.shared.hasShownTipThisSession ? "Yes" : "No") + LabeledContent("Mood Log Count", value: "\(ReflectTipsManager.shared.moodLogCount)") + LabeledContent("Days Using App", value: "\(ReflectTipsManager.shared.daysUsingApp)") + LabeledContent("Current Streak", value: "\(ReflectTipsManager.shared.currentStreak)") + LabeledContent("Has Seen Settings", value: ReflectTipsManager.shared.hasSeenSettings ? "Yes" : "No") + LabeledContent("Shown This Session", value: ReflectTipsManager.shared.hasShownTipThisSession ? "Yes" : "No") } header: { Text("Current Parameters") } diff --git a/Shared/Views/YearView/YearView.swift b/Shared/Views/YearView/YearView.swift index 43ec8ae..6bda27b 100644 --- a/Shared/Views/YearView/YearView.swift +++ b/Shared/Views/YearView/YearView.swift @@ -1,6 +1,6 @@ // // FilterView.swift -// Feels +// Reflect // // Created by Trey Tartt on 1/12/22. // @@ -275,7 +275,7 @@ struct YearView: View { } } .sheet(isPresented: $showSubscriptionStore) { - FeelsSubscriptionStoreView(source: "year_gate") + ReflectSubscriptionStoreView(source: "year_gate") } .sheet(item: $sharePickerData) { data in SharingStylePickerView(title: data.title, designs: data.designs) diff --git a/Shared/Views/YearView/YearViewModel.swift b/Shared/Views/YearView/YearViewModel.swift index 6c83bc4..f1b0e5a 100644 --- a/Shared/Views/YearView/YearViewModel.swift +++ b/Shared/Views/YearView/YearViewModel.swift @@ -1,6 +1,6 @@ // // FilterViewModel.swift -// Feels +// Reflect // // Created by Trey Tartt on 1/17/22. // diff --git a/Tests iOS/DeepLinkTests.swift b/Tests iOS/DeepLinkTests.swift index 809b691..7cbcb02 100644 --- a/Tests iOS/DeepLinkTests.swift +++ b/Tests iOS/DeepLinkTests.swift @@ -22,7 +22,7 @@ final class DeepLinkTests: BaseUITestCase { ) // Send a malformed deep link - let malformedURL = URL(string: "feels://invalidpath")! + let malformedURL = URL(string: "reflect://invalidpath")! app.open(malformedURL) // App should still be running and responsive — verify Day tab still exists @@ -41,7 +41,7 @@ final class DeepLinkTests: BaseUITestCase { captureScreenshot(name: "deeplink_malformed_no_crash") } - /// TC-125: feels://subscribe opens subscription view. + /// TC-125: reflect://subscribe opens subscription view. func testDeepLink_Subscribe_OpensPaywall() { // Verify app launched let tabBar = TabBarScreen(app: app) @@ -53,13 +53,13 @@ final class DeepLinkTests: BaseUITestCase { captureScreenshot(name: "deeplink_before_subscribe") // Send subscribe deep link - let subscribeURL = URL(string: "feels://subscribe")! + let subscribeURL = URL(string: "reflect://subscribe")! app.open(subscribeURL) // Subscription view should appear as a sheet. // Look for common subscription UI elements. let subscribeText = app.staticTexts.matching( - NSPredicate(format: "label CONTAINS[c] 'subscribe' OR label CONTAINS[c] 'premium' OR label CONTAINS[c] 'upgrade' OR label CONTAINS[c] 'Feels+'") + NSPredicate(format: "label CONTAINS[c] 'subscribe' OR label CONTAINS[c] 'premium' OR label CONTAINS[c] 'upgrade' OR label CONTAINS[c] 'Reflect+'") ).firstMatch let found = subscribeText.waitForExistence(timeout: 8) @@ -67,7 +67,7 @@ final class DeepLinkTests: BaseUITestCase { captureScreenshot(name: "deeplink_subscribe_result") XCTAssertTrue(found, - "Subscription view should appear after feels://subscribe deep link" + "Subscription view should appear after reflect://subscribe deep link" ) } } diff --git a/Tests iOS/PremiumCustomizationTests.swift b/Tests iOS/PremiumCustomizationTests.swift index 9452380..828befe 100644 --- a/Tests iOS/PremiumCustomizationTests.swift +++ b/Tests iOS/PremiumCustomizationTests.swift @@ -58,7 +58,7 @@ final class PremiumCustomizationTests: BaseUITestCase { // Verify the subscription sheet appears — look for common subscription // sheet elements (subscription store view or paywall content). - // The FeelsSubscriptionStoreView should appear as a sheet. + // The ReflectSubscriptionStoreView should appear as a sheet. // Give extra time for StoreKit to load products. let subscriptionSheet = app.otherElements.firstMatch _ = subscriptionSheet.waitForExistence(timeout: 5) diff --git a/Tests iOS/Tests_iOS.swift b/Tests iOS/Tests_iOS.swift index 1defeed..f9eeff2 100644 --- a/Tests iOS/Tests_iOS.swift +++ b/Tests iOS/Tests_iOS.swift @@ -7,7 +7,7 @@ import XCTest -// Local copy — UI test target cannot @testable import Feels +// Local copy — UI test target cannot @testable import Reflect private extension Date { static func dates(from fromDate: Date, toDate: Date, includingToDate: Bool = false) -> [Date] { var dates: [Date] = [] diff --git a/docs/ASO-Keywords.md b/docs/ASO-Keywords.md index 88f1ca1..a433888 100644 --- a/docs/ASO-Keywords.md +++ b/docs/ASO-Keywords.md @@ -1,4 +1,4 @@ -# Feels App - Keyword Research & Strategy +# Reflect App - Keyword Research & Strategy ## iOS App Store Keyword Strategy @@ -196,7 +196,7 @@ diario,humor,emocoes,bem-estar,ansiedade,rastreador,saude mental,sentimentos,hab Based on analysis of Daylio, Moodistory, and Moodnotes: -| Keyword | Daylio | Moodistory | Feels Opportunity | +| Keyword | Daylio | Moodistory | Reflect Opportunity | |---------|--------|------------|-------------------| | mood tracker | #1 | #8 | Target Top 10 | | mood journal | #2 | #5 | Target Top 10 | @@ -209,7 +209,7 @@ Based on analysis of Daylio, Moodistory, and Moodnotes: ### Blue Ocean Keywords (Low Competition) -These keywords have low competition and Feels can potentially rank quickly: +These keywords have low competition and Reflect can potentially rank quickly: 1. **live activity mood** - No major competitors 2. **mood streak tracker** - Unique positioning diff --git a/docs/ASO-Metadata.md b/docs/ASO-Metadata.md index cb76828..82e0203 100644 --- a/docs/ASO-Metadata.md +++ b/docs/ASO-Metadata.md @@ -1,11 +1,11 @@ -# Feels App - Optimized App Store Metadata +# Reflect App - Optimized App Store Metadata ## App Name Options ### iOS App Store Constraints - **Character Limit**: 30 characters - **Best Practice**: Brand + Primary Keyword -- **Current Name**: iFeels / Feels +- **Current Name**: Reflect --- @@ -13,7 +13,7 @@ #### Primary Recommendation ``` -Feels: Mood Tracker & Journal +Reflect: Mood Tracker & Journal ``` **Characters**: 28/30 **Rationale**: Includes brand, primary keyword (mood tracker), and secondary keyword (journal) @@ -22,11 +22,11 @@ Feels: Mood Tracker & Journal | Option | Characters | Pros | Cons | |--------|------------|------|------| -| `Feels - Daily Mood Tracker` | 26 | Clear value prop | Less unique | -| `Feels: Mood Diary & Streak` | 27 | Highlights streak feature | "Diary" less searched than "tracker" | -| `Feels - Mood Journal` | 20 | Simple, clean | Missing "tracker" keyword | -| `Feels: Track Your Mood` | 23 | Action-oriented | Generic phrasing | -| `Feels - Mood & Wellness Log` | 28 | Wellness angle | May be too broad | +| `Reflect - Daily Mood Tracker` | 26 | Clear value prop | Less unique | +| `Reflect: Mood Diary & Streak` | 27 | Highlights streak feature | "Diary" less searched than "tracker" | +| `Reflect - Mood Journal` | 20 | Simple, clean | Missing "tracker" keyword | +| `Reflect: Track Your Mood` | 23 | Action-oriented | Generic phrasing | +| `Reflect - Mood & Wellness Log` | 28 | Wellness angle | May be too broad | --- @@ -101,9 +101,9 @@ Take care of your mental health one day at a time. Track moods from Lock Screen ``` Understand your emotions. One tap at a time. -Feels makes mood tracking effortless. Log how you're feeling in just one second from your Lock Screen, Widget, Apple Watch, Control Center, or through Siri. No friction, no complicated forms - just quick check-ins that build into powerful insights. +Reflect makes mood tracking effortless. Log how you're feeling in just one second from your Lock Screen, Widget, Apple Watch, Control Center, or through Siri. No friction, no complicated forms - just quick check-ins that build into powerful insights. -WHY FEELS? +WHY REFLECT? Log Moods From Anywhere - Live Activity on your Lock Screen @@ -148,7 +148,7 @@ FEATURES AT A GLANCE START YOUR WELLNESS JOURNEY -Download Feels today and take the first step toward understanding your emotional patterns. Whether you're tracking for mental wellness, building better habits, or simply curious about your emotional life - Feels is your companion. +Download Reflect today and take the first step toward understanding your emotional patterns. Whether you're tracking for mental wellness, building better habits, or simply curious about your emotional life - Reflect is your companion. Premium Subscription: - Unlock all customization options @@ -165,7 +165,7 @@ Questions or feedback? We'd love to hear from you! ### German (DE) -**Title**: `Feels: Stimmungstracker` +**Title**: `Reflect: Stimmungstracker` **Subtitle**: `Widget, Streaks & Tagebuch` **Promotional Text**: ``` @@ -174,7 +174,7 @@ Tracke deine Stimmung in Sekunden - vom Sperrbildschirm, Widget oder der Apple W ### Spanish (ES) -**Title**: `Feels: Estado de Animo` +**Title**: `Reflect: Estado de Animo` **Subtitle**: `Widget, Rachas y Diario` **Promotional Text**: ``` @@ -183,7 +183,7 @@ Registra tu estado de animo en segundos desde cualquier lugar - pantalla de bloq ### French (FR) -**Title**: `Feels: Suivi d'Humeur` +**Title**: `Reflect: Suivi d'Humeur` **Subtitle**: `Widget, Series et Journal` **Promotional Text**: ``` @@ -192,7 +192,7 @@ Suivez votre humeur en quelques secondes depuis l'ecran de verrouillage, le widg ### Japanese (JA) -**Title**: `Feels: 気分トラッカー` +**Title**: `Reflect: 気分トラッカー` **Subtitle**: `ウィジェット&日記` **Promotional Text**: ``` @@ -201,7 +201,7 @@ Suivez votre humeur en quelques secondes depuis l'ecran de verrouillage, le widg ### Korean (KO) -**Title**: `Feels: 기분 트래커` +**Title**: `Reflect: 기분 트래커` **Subtitle**: `위젯, 연속기록 및 일기` **Promotional Text**: ``` @@ -210,7 +210,7 @@ Suivez votre humeur en quelques secondes depuis l'ecran de verrouillage, le widg ### Portuguese - Brazil (PT-BR) -**Title**: `Feels: Rastreador Humor` +**Title**: `Reflect: Rastreador Humor` **Subtitle**: `Widget, Sequencias e Diario` **Promotional Text**: ``` @@ -224,7 +224,7 @@ Registre seu humor em segundos de qualquer lugar - tela de bloqueio, widget ou A ### Version 1.0.2 Template ``` -Thank you for using Feels! +Thank you for using Reflect! This update includes: - Improved widget layout for small size @@ -235,7 +235,7 @@ This update includes: - Better text contrast for mood colors - Full-screen theme preview -We're constantly improving Feels based on your feedback. If you enjoy the app, please consider leaving a review - it helps others discover us! +We're constantly improving Reflect based on your feedback. If you enjoy the app, please consider leaving a review - it helps others discover us! ``` --- @@ -243,8 +243,8 @@ We're constantly improving Feels based on your feedback. If you enjoy the app, p ## A/B Testing Priorities ### Test 1: App Name -- A: `Feels: Mood Tracker & Journal` -- B: `Feels - Daily Mood Tracker` +- A: `Reflect: Mood Tracker & Journal` +- B: `Reflect - Daily Mood Tracker` ### Test 2: Subtitle - A: `Widget, Streaks & Live Activity` diff --git a/docs/ASO-Strategy.md b/docs/ASO-Strategy.md index 52efdf5..ead8e6f 100644 --- a/docs/ASO-Strategy.md +++ b/docs/ASO-Strategy.md @@ -1,8 +1,8 @@ -# Feels App - App Store Optimization Strategy +# Reflect App - App Store Optimization Strategy ## Executive Summary -Feels is a mood tracking app for iOS, watchOS, and macOS with strong differentiating features including Live Activities, customizable widgets, multiple entry points (Siri, Control Center, Watch), streak tracking, and journaling capabilities. This document outlines a comprehensive ASO strategy to maximize organic visibility and conversions. +Reflect is a mood tracking app for iOS, watchOS, and macOS with strong differentiating features including Live Activities, customizable widgets, multiple entry points (Siri, Control Center, Watch), streak tracking, and journaling capabilities. This document outlines a comprehensive ASO strategy to maximize organic visibility and conversions. --- @@ -25,8 +25,8 @@ Feels is a mood tracking app for iOS, watchOS, and macOS with strong differentia ### Current Positioning -- **App Name**: iFeels / Feels -- **Bundle ID**: com.tt.ifeel +- **App Name**: Reflect +- **Bundle ID**: com.88oakapps.reflect - **Version**: 1.0.2 - **Monetization**: Subscription ($0.99/month or $9.99/year) @@ -36,7 +36,7 @@ Feels is a mood tracking app for iOS, watchOS, and macOS with strong differentia ### Direct Competitors -| App | Key Strength | Weakness vs. Feels | +| App | Key Strength | Weakness vs. Reflect | |-----|-------------|-------------------| | Daylio | Market leader, no-typing interface | No Live Activities, limited customization | | Moodistory | Beautiful design, PDF export | Less entry points | @@ -44,7 +44,7 @@ Feels is a mood tracking app for iOS, watchOS, and macOS with strong differentia | Reflectly | AI journaling | Heavy on journaling, less on tracking | | Bearable | Comprehensive health tracking | Overwhelming for simple mood tracking | -### Competitive Advantages of Feels +### Competitive Advantages of Reflect 1. **Live Activities** - Unique differentiator (few/no competitors have this) 2. **Control Center integration** - Fastest logging possible diff --git a/docs/ASO-Visual-Assets.md b/docs/ASO-Visual-Assets.md index 5f89614..e10fd72 100644 --- a/docs/ASO-Visual-Assets.md +++ b/docs/ASO-Visual-Assets.md @@ -1,4 +1,4 @@ -# Feels App - Visual Asset Optimization Guide +# Reflect App - Visual Asset Optimization Guide ## Overview @@ -100,7 +100,7 @@ Visual assets account for a significant portion of App Store conversion. This gu **Goal**: Showcase ecosystem integration **Visual Elements**: -- Apple Watch showing the Feels app +- Apple Watch showing the Reflect app - Mood logging interface on watch - iPhone optional in background - Caption: "Log moods from your wrist" @@ -180,7 +180,7 @@ Visual assets account for a significant portion of App Store conversion. This gu ``` [0-3s] -Visual: Feels logo animates in +Visual: Reflect logo animates in Text: "Track moods in seconds" [3-8s] @@ -201,7 +201,7 @@ Text: "Make it yours" [22-25s] Visual: App icon with download CTA -Text: "Download Feels today" +Text: "Download Reflect today" ``` ### Audio Recommendations @@ -231,7 +231,7 @@ The app likely uses a mood-related icon. Key considerations: |---------|-------------|-----------------| | A | Abstract smiley face | Broad appeal | | B | Gradient orb/circle | Modern/minimal | -| C | "F" with mood colors | Brand-focused | +| C | "R" with mood colors | Brand-focused | | D | Calendar with mood | Feature-focused | ### Color Psychology diff --git a/docs/AppStoreScreens.pxd b/docs/AppStoreScreens.pxd index 2c20217ae72dbb6884bdf91b9d9c8e2d3b4b4d8c..a98462fa65850c47d30aa907d6d5f9c62209f295 100644 GIT binary patch delta 127916 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 diff --git a/docs/Apple-Features.md b/docs/Apple-Features.md index 79b64b4..a7345d0 100644 --- a/docs/Apple-Features.md +++ b/docs/Apple-Features.md @@ -1,30 +1,30 @@ # Apple Platform Features -This document covers the new Apple-specific features integrated into Feels, including how to trigger and test each one. +This document covers the new Apple-specific features integrated into Reflect, including how to trigger and test each one. --- ## 1. Control Center Widget -**File:** `FeelsWidget2/FeelsWidget.swift` (FeelsMoodControlWidget) +**File:** `ReflectWidget/ReflectMoodControlWidget.swift` (ReflectMoodControlWidget) -**What it does:** Adds a quick-access button to Control Center that opens Feels to log your mood. +**What it does:** Adds a quick-access button to Control Center that opens Reflect to log your mood. ### How to Add to Control Center 1. Open **Settings** > **Control Center** -2. Scroll down to find **Feels - Log Mood** +2. Scroll down to find **Reflect - Log Mood** 3. Tap the **+** button to add it -4. Alternatively: Swipe down from top-right, tap **+** button, find Feels +4. Alternatively: Swipe down from top-right, tap **+** button, find Reflect ### How to Test 1. Add the widget to Control Center (steps above) 2. Open Control Center (swipe down from top-right corner) 3. Tap the "Log Mood" button -4. Feels app should open +4. Reflect app should open ### Implementation Details - Uses `ControlWidget` and `StaticControlConfiguration` -- `OpenFeelsIntent` (AppIntent) handles the button tap +- `OpenReflectIntent` (AppIntent) handles the button tap - `openAppWhenRun = true` ensures the app opens --- @@ -36,11 +36,11 @@ This document covers the new Apple-specific features integrated into Feels, incl **What it does:** Syncs mood entries to Apple Health using the State of Mind API, allowing users to see mood correlations with sleep, exercise, and other health metrics. ### Setup Required -1. Enable HealthKit in **Settings** > **Feels** > **Health** +1. Enable HealthKit in **Settings** > **Reflect** > **Health** 2. Grant write permission for "State of Mind" ### How to Test -1. Go to Feels settings and enable HealthKit sync +1. Go to Reflect settings and enable HealthKit sync 2. Log a mood entry 3. Open **Apple Health** app 4. Go to **Browse** > **Mental Wellbeing** > **State of Mind** @@ -72,26 +72,26 @@ This document covers the new Apple-specific features integrated into Feels, incl #### Log Mood - **Phrases:** - - "Log my mood in Feels" - - "Log mood as [mood] in Feels" - - "Record my mood in Feels" - - "I'm feeling [mood] in Feels" - - "Track my mood in Feels" + - "Log my mood in Reflect" + - "Log mood as [mood] in Reflect" + - "Record my mood in Reflect" + - "I'm feeling [mood] in Reflect" + - "Track my mood in Reflect" #### Check Today's Mood - **Phrases:** - - "What's my mood today in Feels" - - "Check today's mood in Feels" - - "How am I feeling in Feels" + - "What's my mood today in Reflect" + - "Check today's mood in Reflect" + - "How am I feeling in Reflect" #### Get Mood Streak - **Phrases:** - - "What's my mood streak in Feels" - - "Check my streak in Feels" - - "How many days in a row in Feels" + - "What's my mood streak in Reflect" + - "Check my streak in Reflect" + - "How many days in a row in Reflect" ### How to Test -1. Say "Hey Siri, log my mood in Feels" +1. Say "Hey Siri, log my mood in Reflect" 2. Siri will prompt you to select a mood (Horrible, Bad, Average, Good, Great) 3. Confirm selection 4. Siri responds with confirmation and shows a visual snippet @@ -99,7 +99,7 @@ This document covers the new Apple-specific features integrated into Feels, incl ### How to Add to Shortcuts App 1. Open **Shortcuts** app 2. Tap **+** to create new shortcut -3. Search for "Feels" +3. Search for "Reflect" 4. Available actions: Log Mood, Check Today's Mood, Get Mood Streak ### Implementation Details @@ -112,7 +112,7 @@ This document covers the new Apple-specific features integrated into Feels, incl ## 4. Custom Tips System **Files:** -- `Shared/FeelsTips.swift` (Tips definitions and manager) +- `Shared/ReflectTips.swift` (Tips definitions and manager) - `Shared/Views/TipModalView.swift` (Modal UI) **What it does:** Shows themed modal tips to help users discover features throughout the app. Tips appear as beautiful sheets that match the app's current theme. @@ -133,15 +133,15 @@ This document covers the new Apple-specific features integrated into Feels, incl 1. Tips appear automatically based on conditions (one per session) 2. To reset tips for testing: ```swift -FeelsTipsManager.shared.resetAllTips() +ReflectTipsManager.shared.resetAllTips() ``` 3. To disable tips globally: ```swift -FeelsTipsManager.shared.tipsEnabled = false +ReflectTipsManager.shared.tipsEnabled = false ``` ### Implementation Details -- `FeelsTipsManager.shared.resetSession()` called in `FeelsApp.init()` +- `ReflectTipsManager.shared.resetSession()` called in `ReflectApp.init()` - Each tip has `isEligible` property based on user activity parameters - Tips show as themed modal sheets with gradient headers - Only one tip shown per app session @@ -152,7 +152,7 @@ FeelsTipsManager.shared.tipsEnabled = false **Files:** - `Shared/MoodStreakActivity.swift` (Manager + Attributes) -- `FeelsWidget2/FeelsWidget.swift` (Widget views) +- `ReflectWidget/ReflectMoodControlWidget.swift` (Widget views) **What it does:** Shows mood streak progress on the Lock Screen and Dynamic Island. @@ -192,7 +192,7 @@ await LiveActivityManager.shared.endAllActivities() - **Minimal:** Flame icon only ### How to Test -1. Ensure Live Activities are enabled: **Settings** > **Feels** > **Live Activities** +1. Ensure Live Activities are enabled: **Settings** > **Reflect** > **Live Activities** 2. Start a Live Activity (see code above) 3. Lock your phone to see Lock Screen view 4. On iPhone 14 Pro+, check Dynamic Island @@ -223,16 +223,16 @@ New entry types added to track mood entry sources: ## Entitlements & Info.plist -### Entitlements (`Feels (iOS).entitlements`) +### Entitlements (`Reflect (iOS).entitlements`) - `com.apple.developer.healthkit` - HealthKit access - `com.apple.developer.healthkit.access` - health-records -### Info.plist (`Feels--iOS--Info.plist`) +### Info.plist (`Reflect--iOS--Info.plist`) - `NSSupportsLiveActivities` - Enables Live Activities - `NSHealthShareUsageDescription` - HealthKit read permission description - `NSHealthUpdateUsageDescription` - HealthKit write permission description -### Widget Info.plist (`FeelsWidgetExtension-Info.plist`) +### Widget Info.plist (`ReflectWidgetExtension-Info.plist`) - `NSSupportsLiveActivities` - Enables Live Activity widget --- @@ -240,7 +240,7 @@ New entry types added to track mood entry sources: ## Testing Checklist - [ ] Control Center widget appears and opens app -- [ ] Siri responds to "Log my mood in Feels" +- [ ] Siri responds to "Log my mood in Reflect" - [ ] Siri shows mood options and confirms selection - [ ] HealthKit sync writes State of Mind entries - [ ] Tips appear at appropriate times diff --git a/docs/Competitive-Analysis.md b/docs/Competitive-Analysis.md index 73d4620..56923e3 100644 --- a/docs/Competitive-Analysis.md +++ b/docs/Competitive-Analysis.md @@ -307,7 +307,7 @@ Analysis of 8 direct competitors in the iOS mood tracking/journaling category. K --- -## Competitive Gaps & Opportunities for Feels +## Competitive Gaps & Opportunities for Reflect ### Underserved Areas 1. **Simplicity** - Most apps are feature-heavy; simple "vote your mood" is rare diff --git a/docs/Feels_QA_Test_Plan.xlsx b/docs/Reflect_QA_Test_Plan.xlsx similarity index 100% rename from docs/Feels_QA_Test_Plan.xlsx rename to docs/Reflect_QA_Test_Plan.xlsx diff --git a/docs/TipKit-Tips.md b/docs/TipKit-Tips.md index 20578cd..00df030 100644 --- a/docs/TipKit-Tips.md +++ b/docs/TipKit-Tips.md @@ -1,10 +1,10 @@ # Custom Tips System Documentation -This document describes all tips implemented in the Feels app, including their display conditions and locations. +This document describes all tips implemented in the Reflect app, including their display conditions and locations. ## Overview -Tips are displayed as themed modal sheets that match the user's chosen app theme. The system is managed by `FeelsTipsManager` (singleton) and configured with: +Tips are displayed as themed modal sheets that match the user's chosen app theme. The system is managed by `ReflectTipsManager` (singleton) and configured with: - **Display Frequency**: One tip per app session - **Global Toggle**: `tipsEnabled` boolean in UserDefaults - **Persistence**: Shown tip IDs stored in UserDefaults @@ -34,7 +34,7 @@ Tips are displayed as themed modal sheets that match the user's chosen app theme **Display Conditions**: - User has logged at least **7 moods** -**Parameter**: `moodLogCount: Int` (incremented via `FeelsTipsManager.shared.onMoodLogged()`) +**Parameter**: `moodLogCount: Int` (incremented via `ReflectTipsManager.shared.onMoodLogged()`) **Location**: InsightsView (via `.aiInsightsTip()`) @@ -43,13 +43,13 @@ Tips are displayed as themed modal sheets that match the user's chosen app theme ### 3. SiriShortcutTip **Title**: "Use Siri to Log Moods" -**Message**: "Say 'Hey Siri, log my mood as great in Feels' for hands-free logging." +**Message**: "Say 'Hey Siri, log my mood as great in Reflect' for hands-free logging." **Icon**: `mic.fill` **Display Conditions**: - User has logged at least **3 moods** -**Parameter**: `moodLogCount: Int` (incremented via `FeelsTipsManager.shared.onMoodLogged()`) +**Parameter**: `moodLogCount: Int` (incremented via `ReflectTipsManager.shared.onMoodLogged()`) **Location**: SettingsContentView (Features section header, via `.siriShortcutTip()`) @@ -64,7 +64,7 @@ Tips are displayed as themed modal sheets that match the user's chosen app theme **Display Conditions**: - User has viewed the Settings screen -**Parameter**: `hasSeenSettings: Bool` (set via `FeelsTipsManager.shared.onSettingsViewed()`) +**Parameter**: `hasSeenSettings: Bool` (set via `ReflectTipsManager.shared.onSettingsViewed()`) **Location**: SettingsContentView (Health Kit toggle, via `.healthKitSyncTip()`) @@ -106,29 +106,29 @@ Tips are displayed as themed modal sheets that match the user's chosen app theme **Display Conditions**: - User has a current streak of at least **3 days** -**Parameter**: `currentStreak: Int` (updated via `FeelsTipsManager.shared.updateStreak(_:)`) +**Parameter**: `currentStreak: Int` (updated via `ReflectTipsManager.shared.updateStreak(_:)`) **Location**: DayView (via `.moodStreakTip()`) --- -## FeelsTipsManager API +## ReflectTipsManager API ```swift // Reset session flag (call on app launch) -FeelsTipsManager.shared.resetSession() +ReflectTipsManager.shared.resetSession() // Reset all tips (for testing) -FeelsTipsManager.shared.resetAllTips() +ReflectTipsManager.shared.resetAllTips() // Update parameters -FeelsTipsManager.shared.onMoodLogged() // Increments mood log count -FeelsTipsManager.shared.onSettingsViewed() // Marks settings as viewed -FeelsTipsManager.shared.updateDaysUsingApp(_:) // Updates days using app -FeelsTipsManager.shared.updateStreak(_:) // Updates current streak +ReflectTipsManager.shared.onMoodLogged() // Increments mood log count +ReflectTipsManager.shared.onSettingsViewed() // Marks settings as viewed +ReflectTipsManager.shared.updateDaysUsingApp(_:) // Updates days using app +ReflectTipsManager.shared.updateStreak(_:) // Updates current streak // Global toggle -FeelsTipsManager.shared.tipsEnabled = true/false +ReflectTipsManager.shared.tipsEnabled = true/false ``` --- @@ -147,7 +147,7 @@ Tips can be attached to views using these convenience modifiers: .moodStreakTip() // Or use the generic modifier with custom gradient colors: -.feelsTip(FeelsTips.customizeLayout, gradientColors: [.purple, .blue]) +.reflectTip(ReflectTips.customizeLayout, gradientColors: [.purple, .blue]) ``` --- @@ -165,6 +165,6 @@ Tips are displayed as themed modal sheets with: ## Files -- **Tips & Manager**: `Shared/FeelsTips.swift` +- **Tips & Manager**: `Shared/ReflectTips.swift` - **Modal View**: `Shared/Views/TipModalView.swift` -- **Configuration**: `FeelsTipsManager.shared.resetSession()` called in `FeelsApp.swift` +- **Configuration**: `ReflectTipsManager.shared.resetSession()` called in `ReflectApp.swift` diff --git a/docs/XCUITest-Authoring.md b/docs/XCUITest-Authoring.md index bca96c0..9cd3ed5 100644 --- a/docs/XCUITest-Authoring.md +++ b/docs/XCUITest-Authoring.md @@ -50,8 +50,8 @@ Override launch behavior when needed: Targeted suite: ```bash -xcodebuild -project Feels.xcodeproj \ - -scheme "Feels (iOS)" \ +xcodebuild -project Reflect.xcodeproj \ + -scheme "Reflect (iOS)" \ -destination 'platform=iOS Simulator,name=iPhone 16 Pro' \ -only-testing:"Tests iOS/" \ test @@ -60,8 +60,8 @@ xcodebuild -project Feels.xcodeproj \ Full iOS UI suite: ```bash -xcodebuild -project Feels.xcodeproj \ - -scheme "Feels (iOS)" \ +xcodebuild -project Reflect.xcodeproj \ + -scheme "Reflect (iOS)" \ -destination 'platform=iOS Simulator,name=iPhone 16 Pro' \ -only-testing:"Tests iOS" \ test diff --git a/docs/_App-Store-Optimization-Complete-Guide.md b/docs/_App-Store-Optimization-Complete-Guide.md index 30c7f65..09ee45c 100644 --- a/docs/_App-Store-Optimization-Complete-Guide.md +++ b/docs/_App-Store-Optimization-Complete-Guide.md @@ -134,7 +134,7 @@ ASO is the process of optimizing your app's visibility and conversion rate in th │ │ │ HIGHEST WEIGHT: App Title (30 chars) │ │ ├─ Brand name + 1-2 most important keywords │ -│ └─ Example: "Feels - Mood Journal & Tracker" │ +│ └─ Example: "Reflect - Mood Journal & Tracker" │ │ │ │ HIGH WEIGHT: Subtitle (30 chars) │ │ ├─ Secondary keywords & value proposition │ diff --git a/docs/competitors/README.md b/docs/competitors/README.md index c332a32..0d900e2 100644 --- a/docs/competitors/README.md +++ b/docs/competitors/README.md @@ -80,7 +80,7 @@ Analysis of top 5 mood tracking app competitors on the iOS App Store. --- -## Key Takeaways for Feels +## Key Takeaways for Reflect 1. **Quick logging is valued** - Daylio and Moodistory emphasize speed 2. **Privacy is a differentiator** - Moodistory's privacy-first approach stands out diff --git a/uiTestPrompt.md b/uiTestPrompt.md index 875075b..678ab74 100644 --- a/uiTestPrompt.md +++ b/uiTestPrompt.md @@ -8,7 +8,7 @@ Create 3 solid iOS UI tests from the QA plan that compile and run reliably using Project: - Root: /Users/treyt/Desktop/code/Feels -- QA source: /Users/treyt/Desktop/code/Feels/docs/Feels_QA_Test_Plan.xlsx +- QA source: /Users/treyt/Desktop/code/Feels/docs/Reflect_QA_Test_Plan.xlsx Optional explicit test IDs/names from me (if provided, prioritize these): @@ -56,7 +56,7 @@ Deliverable shape: Validation gates (required before done): 1. Run only the 3 new tests (not full suite), e.g.: - - `xcodebuild -project Feels.xcodeproj -scheme "Feels (iOS)" -destination 'platform=iOS Simulator,name=iPhone 16 Pro' -only-testing:"Tests iOS//testA" -only-testing:"Tests iOS//testB" -only-testing:"Tests iOS//testC" test` + - `xcodebuild -project Reflect.xcodeproj -scheme "Reflect (iOS)" -destination 'platform=iOS Simulator,name=iPhone 16 Pro' -only-testing:"Tests iOS//testA" -only-testing:"Tests iOS//testB" -only-testing:"Tests iOS//testC" test` 2. If failures occur, fix and rerun until green. 3. Run the same targeted command a second time to check flakiness. 4. Only mark complete if both runs pass.