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 <noreply@anthropic.com>
This commit is contained in:
Trey t
2026-02-26 11:47:16 -06:00
parent b1a54d2844
commit 0442eab1f8
380 changed files with 858 additions and 1077 deletions

2
.gitignore vendored
View File

@@ -77,4 +77,4 @@ Secrets.swift
# Screenshots and promo assets
/screens/
feels-promo/
reflect-promo/

View File

@@ -1,4 +1,4 @@
# Feels Agent Instructions
# Reflect Agent Instructions
## XCUITest Workflows (Required)

View File

@@ -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/<SuiteName>" test
xcodebuild -project Reflect.xcodeproj -scheme "Reflect (iOS)" -destination 'platform=iOS Simulator,name=iPhone 17 Pro' -only-testing:"Tests iOS/<SuiteName>" 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

View File

@@ -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",

View File

@@ -1,194 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>SchemeUserState</key>
<dict>
<key>Feels (iOS).xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>1</integer>
</dict>
<key>Feels (macOS).xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>2</integer>
</dict>
<key>Feels Watch App.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>3</integer>
</dict>
<key>FeelsWidgetExtension.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>0</integer>
</dict>
<key>PlaygroundChart (Playground) 1.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>7</integer>
</dict>
<key>PlaygroundChart (Playground) 10.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>13</integer>
</dict>
<key>PlaygroundChart (Playground) 11.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>14</integer>
</dict>
<key>PlaygroundChart (Playground) 12.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>15</integer>
</dict>
<key>PlaygroundChart (Playground) 13.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>16</integer>
</dict>
<key>PlaygroundChart (Playground) 14.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>17</integer>
</dict>
<key>PlaygroundChart (Playground) 2.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>8</integer>
</dict>
<key>PlaygroundChart (Playground) 3.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>7</integer>
</dict>
<key>PlaygroundChart (Playground) 4.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>8</integer>
</dict>
<key>PlaygroundChart (Playground) 5.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>9</integer>
</dict>
<key>PlaygroundChart (Playground) 6.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>2</integer>
</dict>
<key>PlaygroundChart (Playground) 7.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>10</integer>
</dict>
<key>PlaygroundChart (Playground) 8.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>11</integer>
</dict>
<key>PlaygroundChart (Playground) 9.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>12</integer>
</dict>
<key>PlaygroundChart (Playground).xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>6</integer>
</dict>
<key>Promises (Playground) 1.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>4</integer>
</dict>
<key>Promises (Playground) 2.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>5</integer>
</dict>
<key>Promises (Playground) 3.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>9</integer>
</dict>
<key>Promises (Playground) 4.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>10</integer>
</dict>
<key>Promises (Playground) 5.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>11</integer>
</dict>
<key>Promises (Playground).xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>2</integer>
</dict>
</dict>
<key>SuppressBuildableAutocreation</key>
<dict>
<key>1CD90AF4278C7DE0001C4FEA</key>
<dict>
<key>primary</key>
<true/>
</dict>
<key>1CD90B01278C7DE0001C4FEA</key>
<dict>
<key>primary</key>
<true/>
</dict>
<key>1CD90B44278C7E7A001C4FEA</key>
<dict>
<key>primary</key>
<true/>
</dict>
</dict>
</dict>
</plist>

View File

@@ -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()
}
}

View File

@@ -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

View File

@@ -12,7 +12,7 @@
</array>
<key>com.apple.developer.icloud-container-identifiers</key>
<array>
<string>iCloud.com.88oakapps.feels</string>
<string>iCloud.com.88oakapps.reflect</string>
</array>
<key>com.apple.developer.icloud-services</key>
<array>
@@ -20,7 +20,7 @@
</array>
<key>com.apple.security.application-groups</key>
<array>
<string>group.com.88oakapps.feels</string>
<string>group.com.88oakapps.reflect</string>
</array>
</dict>
</plist>

View File

@@ -10,7 +10,7 @@
<array/>
<key>com.apple.developer.icloud-container-identifiers</key>
<array>
<string>iCloud.com.88oakapps.feels.debug</string>
<string>iCloud.com.88oakapps.reflect.debug</string>
</array>
<key>com.apple.developer.icloud-services</key>
<array>
@@ -18,7 +18,7 @@
</array>
<key>com.apple.security.application-groups</key>
<array>
<string>group.com.88oakapps.feels.debug</string>
<string>group.com.88oakapps.reflect.debug</string>
</array>
</dict>
</plist>

View File

Before

Width:  |  Height:  |  Size: 936 KiB

After

Width:  |  Height:  |  Size: 936 KiB

View File

@@ -1,6 +1,6 @@
//
// ContentView.swift
// Feels Watch App
// Reflect Watch App
//
// Main voting interface for logging moods on Apple Watch.
//

View File

@@ -6,7 +6,7 @@
<string>development</string>
<key>com.apple.developer.icloud-container-identifiers</key>
<array>
<string>iCloud.com.88oakapps.feels</string>
<string>iCloud.com.88oakapps.reflect</string>
</array>
<key>com.apple.developer.icloud-services</key>
<array>
@@ -14,7 +14,7 @@
</array>
<key>com.apple.security.application-groups</key>
<array>
<string>group.com.88oakapps.feels</string>
<string>group.com.88oakapps.reflect</string>
</array>
</dict>
</plist>

View File

@@ -6,7 +6,7 @@
<string>development</string>
<key>com.apple.developer.icloud-container-identifiers</key>
<array>
<string>iCloud.com.88oakapps.feels.debug</string>
<string>iCloud.com.88oakapps.reflect.debug</string>
</array>
<key>com.apple.developer.icloud-services</key>
<array>
@@ -14,7 +14,7 @@
</array>
<key>com.apple.security.application-groups</key>
<array>
<string>group.com.88oakapps.feels.debug</string>
<string>group.com.88oakapps.reflect.debug</string>
</array>
</dict>
</plist>

View File

@@ -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<FeelsEntry>) -> Void) {
func getTimeline(in context: Context, completion: @escaping (Timeline<ReflectEntry>) -> 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))
}

View File

@@ -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

View File

@@ -4,16 +4,16 @@
<dict>
<key>BGTaskSchedulerPermittedIdentifiers</key>
<array>
<string>com.tt.feels.dbUpdateMissing</string>
<string>com.88oakapps.reflect.dbUpdateMissing</string>
</array>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLName</key>
<string>com.tt.feels</string>
<string>com.88oakapps.reflect</string>
<key>CFBundleURLSchemes</key>
<array>
<string>feels</string>
<string>reflect</string>
</array>
</dict>
</array>

View File

@@ -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 = "<group>"; };
0359E1D32D936859E5A0C9F3 /* AppResumeTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppResumeTests.swift; sourceTree = "<group>"; };
17DC4C498A1185DC831F4593 /* LocalizationTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalizationTests.swift; sourceTree = "<group>"; };
1C0DAB50279DB0FB003B1F21 /* Localizable.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = Feels/Localizable.xcstrings; sourceTree = "<group>"; };
1C0DAB50279DB0FB003B1F21 /* Reflect/Localizable.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = Reflect/Localizable.xcstrings; sourceTree = "<group>"; };
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 = "<group>"; };
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 = "<group>"; };
@@ -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 = "<group>"; };
1CD90B14278C7DE0001C4FEA /* Tests_macOSLaunchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tests_macOSLaunchTests.swift; sourceTree = "<group>"; };
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 = "<group>"; };
1CD90B6A278C7F75001C4FEA /* Feels (iOS).entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "Feels (iOS).entitlements"; sourceTree = "<group>"; };
1CD90B69278C7F65001C4FEA /* Reflect--iOS--Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "Reflect--iOS--Info.plist"; sourceTree = "<group>"; };
1CD90B6A278C7F75001C4FEA /* Reflect (iOS).entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "Reflect (iOS).entitlements"; sourceTree = "<group>"; };
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 = "<group>"; };
1CD90B6F278C8000001C4FEA /* FeelsWidgetExtensionDev.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = FeelsWidgetExtensionDev.entitlements; sourceTree = "<group>"; };
1CD90B70278C8000001C4FEA /* Feels (iOS)Dev.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = "Feels (iOS)Dev.entitlements"; sourceTree = "<group>"; };
1CD90B6D278C7F89001C4FEA /* ReflectWidgetExtension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = ReflectWidgetExtension.entitlements; sourceTree = "<group>"; };
1CD90B6F278C8000001C4FEA /* ReflectWidgetExtensionDev.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = ReflectWidgetExtensionDev.entitlements; sourceTree = "<group>"; };
1CD90B70278C8000001C4FEA /* Reflect (iOS)Dev.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = "Reflect (iOS)Dev.entitlements"; sourceTree = "<group>"; };
1CDEFBBE2F3B8736006AE6A1 /* Configuration.storekit */ = {isa = PBXFileReference; lastKnownFileType = text; path = Configuration.storekit; sourceTree = "<group>"; };
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 = "<group>"; };
29CE4110A0D8FBBAD7F92BDF /* BaseUITestCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseUITestCase.swift; sourceTree = "<group>"; };
29E2A2FC314F88244CA946BF /* StreakTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = StreakTests.swift; sourceTree = "<group>"; };
@@ -191,8 +191,8 @@
B0C1D2E3F4A5B6C7D8E9FA0B /* AllDayViewStylesTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AllDayViewStylesTests.swift; sourceTree = "<group>"; };
B2C3D4E5F6A7B8C9D0E1F2A3 /* CustomizeScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomizeScreen.swift; sourceTree = "<group>"; };
B4C5D6E7F8A9B0C1D2E3F4A5 /* PaywallGateTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PaywallGateTests.swift; sourceTree = "<group>"; };
B60015D02A064FF582E232FD /* Feels Watch AppDebug.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "Feels Watch App/Feels Watch AppDebug.entitlements"; sourceTree = "<group>"; };
B8AB4CD73C2B4DC89C6FE84D /* Feels Watch App.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "Feels Watch App/Feels Watch App.entitlements"; sourceTree = "<group>"; };
B60015D02A064FF582E232FD /* Reflect Watch App/Reflect Watch AppDebug.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "Reflect Watch App/Reflect Watch AppDebug.entitlements"; sourceTree = "<group>"; };
B8AB4CD73C2B4DC89C6FE84D /* Reflect Watch App/Reflect Watch App.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "Reflect Watch App/Reflect Watch App.entitlements"; sourceTree = "<group>"; };
B8C9D0E1F2A3B4C5D6E7F8A9 /* MonthViewTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MonthViewTests.swift; sourceTree = "<group>"; };
BB22222222222222BBBBBBBB /* MoodLoggingEmptyStateTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoodLoggingEmptyStateTests.swift; sourceTree = "<group>"; };
BE4D06D4E7188339DE8BC040 /* SettingsLegalLinksTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SettingsLegalLinksTests.swift; sourceTree = "<group>"; };
@@ -208,7 +208,7 @@
D4E5F6A7B8C9D0E1F2A3B4C5 /* MoodReplacementTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoodReplacementTests.swift; sourceTree = "<group>"; };
D6E7F8A9B0C1D2E3F4A5B6C7 /* IconPackTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IconPackTests.swift; sourceTree = "<group>"; };
D9475CC3818201762FA57D91 /* YearViewHeatmapTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = YearViewHeatmapTests.swift; sourceTree = "<group>"; };
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 = "<group>"; };
DD44444444444444DDDDDDDD /* EntryDetailTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EntryDetailTests.swift; sourceTree = "<group>"; };
DD717F91BD65382B7DDFE3C4 /* VoteLogicsTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = VoteLogicsTests.swift; sourceTree = "<group>"; };
@@ -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 = "<group>";
};
1C0009922EE938FC009C9ED5 /* FeelsWidget2 */ = {
isa = PBXFileSystemSynchronizedRootGroup;
exceptions = (
);
explicitFileTypes = {
};
explicitFolders = (
);
path = FeelsWidget2;
sourceTree = "<group>";
};
579031D619ED4B989145EEB1 /* Feels Watch App */ = {
isa = PBXFileSystemSynchronizedRootGroup;
exceptions = (
);
explicitFileTypes = {
};
explicitFolders = (
);
path = "Feels Watch App";
sourceTree = "<group>";
};
1C00073D2EE9388A009C9ED5 /* Shared */ = {isa = PBXFileSystemSynchronizedRootGroup; exceptions = (2166CE8AA7264FC2B4BFAAAC /* PBXFileSystemSynchronizedBuildFileExceptionSet */, 1C000C162EE93AE3009C9ED5 /* PBXFileSystemSynchronizedBuildFileExceptionSet */, ); explicitFileTypes = {}; explicitFolders = (); path = Shared; sourceTree = "<group>"; };
1C0009922EE938FC009C9ED5 /* ReflectWidget */ = {isa = PBXFileSystemSynchronizedRootGroup; explicitFileTypes = {}; explicitFolders = (); path = ReflectWidget; sourceTree = "<group>"; };
579031D619ED4B989145EEB1 /* Reflect Watch App */ = {isa = PBXFileSystemSynchronizedRootGroup; explicitFileTypes = {}; explicitFolders = (); path = "Reflect Watch App"; sourceTree = "<group>"; };
/* 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 = "<group>";
};
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 = "<group>";
@@ -500,7 +468,7 @@
name = Frameworks;
sourceTree = "<group>";
};
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 = "<group>";
};
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 */,

View File

@@ -15,9 +15,9 @@
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "1CD90AF4278C7DE0001C4FEA"
BuildableName = "Feels.app"
BlueprintName = "Feels (iOS)"
ReferencedContainer = "container:Feels.xcodeproj">
BuildableName = "Reflect.app"
BlueprintName = "Reflect (iOS)"
ReferencedContainer = "container:Reflect.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
@@ -33,9 +33,9 @@
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "B375A511826E3AB53E2CF51A"
BuildableName = "FeelsTests.xctest"
BlueprintName = "FeelsTests"
ReferencedContainer = "container:Feels.xcodeproj">
BuildableName = "ReflectTests.xctest"
BlueprintName = "ReflectTests"
ReferencedContainer = "container:Reflect.xcodeproj">
</BuildableReference>
</TestableReference>
<TestableReference
@@ -45,7 +45,7 @@
BlueprintIdentifier = "1CD90B01278C7DE0001C4FEA"
BuildableName = "Tests iOS.xctest"
BlueprintName = "Tests iOS"
ReferencedContainer = "container:Feels.xcodeproj">
ReferencedContainer = "container:Reflect.xcodeproj">
</BuildableReference>
</TestableReference>
</Testables>
@@ -65,9 +65,9 @@
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "1CD90AF4278C7DE0001C4FEA"
BuildableName = "Feels.app"
BlueprintName = "Feels (iOS)"
ReferencedContainer = "container:Feels.xcodeproj">
BuildableName = "Reflect.app"
BlueprintName = "Reflect (iOS)"
ReferencedContainer = "container:Reflect.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<StoreKitConfigurationFileReference
@@ -85,9 +85,9 @@
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "1CD90AF4278C7DE0001C4FEA"
BuildableName = "Feels.app"
BlueprintName = "Feels (iOS)"
ReferencedContainer = "container:Feels.xcodeproj">
BuildableName = "Reflect.app"
BlueprintName = "Reflect (iOS)"
ReferencedContainer = "container:Reflect.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>

View File

@@ -16,9 +16,9 @@
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "1CD90B44278C7E7A001C4FEA"
BuildableName = "FeelsWidgetExtension.appex"
BlueprintName = "FeelsWidgetExtension"
ReferencedContainer = "container:Feels.xcodeproj">
BuildableName = "ReflectWidgetExtension.appex"
BlueprintName = "ReflectWidgetExtension"
ReferencedContainer = "container:Reflect.xcodeproj">
</BuildableReference>
</BuildActionEntry>
<BuildActionEntry
@@ -30,9 +30,9 @@
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "1CD90AF4278C7DE0001C4FEA"
BuildableName = "Feels.app"
BlueprintName = "Feels (iOS)"
ReferencedContainer = "container:Feels.xcodeproj">
BuildableName = "Reflect.app"
BlueprintName = "Reflect (iOS)"
ReferencedContainer = "container:Reflect.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
@@ -63,24 +63,24 @@
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "1CD90B44278C7E7A001C4FEA"
BuildableName = "FeelsWidgetExtension.appex"
BlueprintName = "FeelsWidgetExtension"
ReferencedContainer = "container:Feels.xcodeproj">
BuildableName = "ReflectWidgetExtension.appex"
BlueprintName = "ReflectWidgetExtension"
ReferencedContainer = "container:Reflect.xcodeproj">
</BuildableReference>
</RemoteRunnable>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "1CD90AF4278C7DE0001C4FEA"
BuildableName = "Feels.app"
BlueprintName = "Feels (iOS)"
ReferencedContainer = "container:Feels.xcodeproj">
BuildableName = "Reflect.app"
BlueprintName = "Reflect (iOS)"
ReferencedContainer = "container:Reflect.xcodeproj">
</BuildableReference>
</MacroExpansion>
<EnvironmentVariables>
<EnvironmentVariable
key = "_XCWidgetKind"
value = "FeelsIconWidget"
value = "ReflectIconWidget"
isEnabled = "YES">
</EnvironmentVariable>
<EnvironmentVariable
@@ -108,9 +108,9 @@
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "1CD90AF4278C7DE0001C4FEA"
BuildableName = "Feels.app"
BlueprintName = "Feels (iOS)"
ReferencedContainer = "container:Feels.xcodeproj">
BuildableName = "Reflect.app"
BlueprintName = "Reflect (iOS)"
ReferencedContainer = "container:Reflect.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>

View File

@@ -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"
}
}
}

View File

@@ -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 {

View File

@@ -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 {

View File

@@ -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 {

View File

@@ -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 {

View File

@@ -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 {

View File

@@ -7,7 +7,7 @@
<key>NSExtensionAttributes</key>
<dict>
<key>WKAppBundleIdentifier</key>
<string>com.88oak.FeelsDebug.watchkitapp</string>
<string>com.88oak.ReflectDebug.watchkitapp</string>
</dict>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.watchkit</string>

View File

@@ -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"

View File

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 32 KiB

View File

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 32 KiB

View File

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

View File

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

View File

Before

Width:  |  Height:  |  Size: 7.0 KiB

After

Width:  |  Height:  |  Size: 7.0 KiB

View File

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View File

Before

Width:  |  Height:  |  Size: 7.7 KiB

After

Width:  |  Height:  |  Size: 7.7 KiB

View File

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Some files were not shown because too many files have changed in this diff Show More