feat: redesign player with Dynamic Island, compact timer, and fix Live Activity timer drift
Some checks failed
CI / TypeScript (pull_request) Failing after 5s
CI / ESLint (pull_request) Failing after 3s
CI / Tests (pull_request) Failing after 5s
CI / Build Check (pull_request) Has been skipped
CI / Admin Web Tests (pull_request) Successful in 2m5s
CI / Deploy Edge Functions (pull_request) Has been skipped

## What changed

### Player Redesign (video-first layout)
- New compact timer ring (110pt) with phase label, replaces 240pt ring
- Auto-hide top bar with block progress dots (3s auto-dismiss)
- Expandable now-playing music pill with skip control
- Bottom control bar with heart rate, play/pause, and skip
- Exercise caption with 'Next' preview during rest phases
- Compact round counter (capsule dots)

### Dynamic Island & Live Activities
- WorkoutLiveActivity widget: expanded, compact, and minimal views
- Phase-colored timers with Text(timerInterval:) countdown
- Shows exercise name, round progress, heart rate, music track
- MusicLiveActivity: standalone music now-playing widget
- LiveActivityMusicBars animated component
- Deep link from Dynamic Island back to app

### Timer Drift Fix (critical)
- Store a stable phaseEndDate once per phase instead of
  recalculating Date() + timeRemaining on every update
- Prevents dynamic island countdown from rubber-banding
  due to 5-second periodic update recalculation drift
- Reset phaseEndDate on phase change and resume from pause
- Guard Live Activity updates behind vm.isRunning to prevent
  premature creation when music track loads before workout start
- Fixes timer showing 0 in Dynamic Island when expanding
  from home screen

### New PlayerViewModel timer engine
- Full phase support: prep, warmup, work, rest,
  interBlockRest, cooldown, complete
- 1-second countdown with audio cues at 3-2-1
- Phase transitions with spring animation and haptics
- HealthKit live session integration
- Workout session recording with completion

### Music Service
- New MusicPlayerViewModel with vibe-based playlist loading
- Track info exposed for Dynamic Island display
- Skip track support from Dynamic Island notification action
- Automatic play/pause based on phase and running state

### Additional
- ZoneHighlightIcon component for HomeTab zone cards
- Updated watchOS localizations with complication strings
- Info.plist updated for widget extension
This commit is contained in:
Millian Lamiaux
2026-04-25 23:51:46 +02:00
parent 7f5ea9c6e9
commit b0d364eca2
17 changed files with 1797 additions and 377 deletions

View File

@@ -30,6 +30,8 @@
59B482DEBAA43EE5F24B883D /* HomeTab.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB04FA5E81BD1E52DEFB3AC2 /* HomeTab.swift */; };
5A25DA9A1B21F5EED15BA370 /* ProgramDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6BFF744890571DE314540E16 /* ProgramDetailView.swift */; };
5A402D7E31059AB7107B625C /* MusicPlayerViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5505FBD6E001AE3AFD413ADA /* MusicPlayerViewModel.swift */; };
5B01ABC32F9B8FFD006E707D /* MusicActivityAttributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B01ABC22F9B8FFD006E707D /* MusicActivityAttributes.swift */; };
5B01ABC82F9B90AF006E707D /* ActivityKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5B01ABC62F9B909E006E707D /* ActivityKit.framework */; };
5CE2F2210BEF17AC304F2AC2 /* HealthSnapshot.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1DE8A4DAD846A879B8ED379 /* HealthSnapshot.swift */; };
60503F963221C7FCF719C493 /* ActivityTab.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84123E854DE0BF3E0D4F0912 /* ActivityTab.swift */; };
6060D95D485E4188EAABDDED /* WatchRootView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AEC37E6361DC4C7AE326139 /* WatchRootView.swift */; };
@@ -68,9 +70,17 @@
E4ED0B8CABBD3502EA468F21 /* HomeViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD1AF33C89F42294599C369A /* HomeViewModel.swift */; };
EDAFF4CD2ACE82CC2C097B3C /* PaywallView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA21206AD91A5F95926EEA05 /* PaywallView.swift */; };
EE6C591611D52C36ED5E03C6 /* AppState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EC19129CD3C493C8B2AEFA8 /* AppState.swift */; };
F2E1D0C9B8A7F6E5D4C3B2A1 /* ZoneHighlightIcon.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1B2C3D4E5F6A7B8C9D0E1F2 /* ZoneHighlightIcon.swift */; };
F80248DC6213339BC8F9C9A2 /* TabataGoComplication.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDA5D50FD057EF30BE7915F5 /* TabataGoComplication.swift */; };
FD47EC832E23E0AF1D6FFE47 /* PolicyViews.swift in Sources */ = {isa = PBXBuildFile; fileRef = 525C7E8EC6EF89E00D34672E /* PolicyViews.swift */; };
FE14257B8CFFDC47C72AE079 /* HealthViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63599808389B70FC2F6A43C3 /* HealthViewModel.swift */; };
AAA001AAA001AAA001AAA001 /* MusicActivityAttributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B01ABC22F9B8FFD006E707D /* MusicActivityAttributes.swift */; };
AAA002AAA002AAA002AAA002 /* MusicLiveActivity.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBB001BBB001BBB001BBB001 /* MusicLiveActivity.swift */; };
AAA003AAA003AAA003AAA003 /* TabataGoWidgetBundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBB002BBB002BBB002BBB002 /* TabataGoWidgetBundle.swift */; };
AAA004AAA004AAA004AAA004 /* TabataGoWidget.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = BBB004BBB004BBB004BBB004 /* TabataGoWidget.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
AAA005AAA005AAA005AAA005 /* WorkoutActivityAttributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBB005BBB005BBB005BBB005 /* WorkoutActivityAttributes.swift */; };
AAA006AAA006AAA006AAA006 /* WorkoutActivityAttributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBB005BBB005BBB005BBB005 /* WorkoutActivityAttributes.swift */; };
AAA007AAA007AAA007AAA007 /* WorkoutLiveActivity.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBB006BBB006BBB006BBB006 /* WorkoutLiveActivity.swift */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@@ -102,9 +112,26 @@
remoteGlobalIDString = 92991789C3A5B2A5FACF07A1;
remoteInfo = TabataGo;
};
FFF001FFF001FFF001FFF001 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 5D5CB9093007DF74EBDE3C98 /* Project object */;
proxyType = 1;
remoteGlobalIDString = EEE001EEE001EEE001EEE001;
remoteInfo = TabataGoWidget;
};
/* End PBXContainerItemProxy section */
/* Begin PBXCopyFilesBuildPhase section */
DDD002DDD002DDD002DDD002 /* Embed App Extensions */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 13;
files = (
AAA004AAA004AAA004AAA004 /* TabataGoWidget.appex in Embed App Extensions */,
);
name = "Embed App Extensions";
runOnlyForDeploymentPostprocessing = 0;
};
76FE977236B376F31232D242 /* Embed Watch Content */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
@@ -152,6 +179,8 @@
5505FBD6E001AE3AFD413ADA /* MusicPlayerViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MusicPlayerViewModel.swift; sourceTree = "<group>"; };
58DEACB2D18F636B35BB2C48 /* TabataGoSchema.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabataGoSchema.swift; sourceTree = "<group>"; };
5ACBDB7D81F575AC5370E82F /* WatchL10n.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WatchL10n.swift; sourceTree = "<group>"; };
5B01ABC22F9B8FFD006E707D /* MusicActivityAttributes.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MusicActivityAttributes.swift; sourceTree = "<group>"; };
5B01ABC62F9B909E006E707D /* ActivityKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ActivityKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS26.4.sdk/System/Library/Frameworks/ActivityKit.framework; sourceTree = DEVELOPER_DIR; };
5F5D3568A736B7A326874677 /* Localizable.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = Localizable.xcstrings; sourceTree = "<group>"; };
61E5AA44513F793EA7FEBA00 /* Theme.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Theme.swift; sourceTree = "<group>"; };
63599808389B70FC2F6A43C3 /* HealthViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HealthViewModel.swift; sourceTree = "<group>"; };
@@ -171,6 +200,7 @@
9B5DFE227FDB6400C8D7A4A4 /* ProfileTab.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileTab.swift; sourceTree = "<group>"; };
9CE731C42C570A89F2C6F613 /* Strings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Strings.swift; sourceTree = "<group>"; };
9EC19129CD3C493C8B2AEFA8 /* AppState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppState.swift; sourceTree = "<group>"; };
A1B2C3D4E5F6A7B8C9D0E1F2 /* ZoneHighlightIcon.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ZoneHighlightIcon.swift; sourceTree = "<group>"; };
A7C07E8AF566483359CE2FEC /* TabataGoTests.xctest */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.cfbundle; path = TabataGoTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
A84A0F7F17713D5D0A679122 /* PurchaseService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PurchaseService.swift; sourceTree = "<group>"; };
ACA8445E547E41DF784C3D2F /* ActivityRingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActivityRingView.swift; sourceTree = "<group>"; };
@@ -198,6 +228,12 @@
F8242C26A4F51BE7AA779840 /* RootView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RootView.swift; sourceTree = "<group>"; };
FAEBB2380DAC8F565F556D41 /* WorkoutCalendarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkoutCalendarView.swift; sourceTree = "<group>"; };
FB04FA5E81BD1E52DEFB3AC2 /* HomeTab.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeTab.swift; sourceTree = "<group>"; };
BBB001BBB001BBB001BBB001 /* MusicLiveActivity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MusicLiveActivity.swift; sourceTree = "<group>"; };
BBB002BBB002BBB002BBB002 /* TabataGoWidgetBundle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabataGoWidgetBundle.swift; sourceTree = "<group>"; };
BBB003BBB003BBB003BBB003 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; };
BBB004BBB004BBB004BBB004 /* TabataGoWidget.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = TabataGoWidget.appex; sourceTree = BUILT_PRODUCTS_DIR; };
BBB005BBB005BBB005BBB005 /* WorkoutActivityAttributes.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkoutActivityAttributes.swift; sourceTree = "<group>"; };
BBB006BBB006BBB006BBB006 /* WorkoutLiveActivity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkoutLiveActivity.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -207,6 +243,7 @@
files = (
20FD0BC9A6E01E8EA182E030 /* Supabase in Frameworks */,
CA45F50F953886A372F22AA4 /* RevenueCat in Frameworks */,
5B01ABC82F9B90AF006E707D /* ActivityKit.framework in Frameworks */,
80214BDEB93076416728E9BD /* PostHog in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
@@ -270,6 +307,8 @@
DB98CF3F29FCFCDE4D54B1A8 /* TabataGoTests */,
479C55D953F3D9AA136DE1BA /* TabataGoUITests */,
66E9DD477B9F90EF36226076 /* TabataGoWatch */,
CCC001CCC001CCC001CCC001 /* TabataGoWidget */,
5B01ABC52F9B909E006E707D /* Frameworks */,
F992A53DB1C399DCFE3C8BF2 /* Products */,
);
sourceTree = "<group>";
@@ -317,6 +356,14 @@
path = Onboarding;
sourceTree = "<group>";
};
5B01ABC52F9B909E006E707D /* Frameworks */ = {
isa = PBXGroup;
children = (
5B01ABC62F9B909E006E707D /* ActivityKit.framework */,
);
name = Frameworks;
sourceTree = "<group>";
};
66E9DD477B9F90EF36226076 /* TabataGoWatch */ = {
isa = PBXGroup;
children = (
@@ -379,6 +426,7 @@
A4BD547C912B1970BB98FC73 /* Player */,
C9F93E0937EB534BC24EF2FA /* Programs */,
EEAEB608A9FC8E5981B57A89 /* Settings */,
AA11BB22CC33DD44EE55FF66 /* Components */,
8B90DED418BDA3697748C37D /* Tabs */,
);
path = Views;
@@ -402,6 +450,14 @@
path = Utilities;
sourceTree = "<group>";
};
AA11BB22CC33DD44EE55FF66 /* Components */ = {
isa = PBXGroup;
children = (
A1B2C3D4E5F6A7B8C9D0E1F2 /* ZoneHighlightIcon.swift */,
);
path = Components;
sourceTree = "<group>";
};
BD69946901F21DE2BEE0D8D9 /* TabataGo */ = {
isa = PBXGroup;
children = (
@@ -438,6 +494,17 @@
path = ViewModels;
sourceTree = "<group>";
};
CCC001CCC001CCC001CCC001 /* TabataGoWidget */ = {
isa = PBXGroup;
children = (
BBB003BBB003BBB003BBB003 /* Info.plist */,
BBB001BBB001BBB001BBB001 /* MusicLiveActivity.swift */,
BBB002BBB002BBB002BBB002 /* TabataGoWidgetBundle.swift */,
BBB006BBB006BBB006BBB006 /* WorkoutLiveActivity.swift */,
);
path = TabataGoWidget;
sourceTree = "<group>";
};
CE5E34713E694FAEED0F3480 /* Utilities */ = {
isa = PBXGroup;
children = (
@@ -485,6 +552,8 @@
7FE34000653EE789117CE9D9 /* UserProfile.swift */,
B6E64CFB210A549AC85F878D /* WorkoutProgram.swift */,
BBBBFC7FC6A52DE9908EE4A6 /* WorkoutSession.swift */,
5B01ABC22F9B8FFD006E707D /* MusicActivityAttributes.swift */,
BBB005BBB005BBB005BBB005 /* WorkoutActivityAttributes.swift */,
);
path = Models;
sourceTree = "<group>";
@@ -516,6 +585,7 @@
B7EDA5BF7F25E3279A4B1A61 /* TabataGoUITests.xctest */,
484865AEFA8CCD26C4AE7F73 /* TabataGoWatch.app */,
255972F9906563A0921C47C0 /* TabataGoWatchWidget.appex */,
BBB004BBB004BBB004BBB004 /* TabataGoWidget.appex */,
);
name = Products;
sourceTree = "<group>";
@@ -560,6 +630,23 @@
productReference = 255972F9906563A0921C47C0 /* TabataGoWatchWidget.appex */;
productType = "com.apple.product-type.app-extension";
};
EEE001EEE001EEE001EEE001 /* TabataGoWidget */ = {
isa = PBXNativeTarget;
buildConfigurationList = III001III001III001III001 /* Build configuration list for PBXNativeTarget "TabataGoWidget" */;
buildPhases = (
DDD001DDD001DDD001DDD001 /* Sources */,
);
buildRules = (
);
dependencies = (
);
name = TabataGoWidget;
packageProductDependencies = (
);
productName = TabataGoWidget;
productReference = BBB004BBB004BBB004BBB004 /* TabataGoWidget.appex */;
productType = "com.apple.product-type.app-extension";
};
92991789C3A5B2A5FACF07A1 /* TabataGo */ = {
isa = PBXNativeTarget;
buildConfigurationList = D920067B8306F17FB19B987C /* Build configuration list for PBXNativeTarget "TabataGo" */;
@@ -568,11 +655,13 @@
3D4690E104FE866070533A03 /* Resources */,
078CF2C46E747BF4F8A74030 /* Frameworks */,
76FE977236B376F31232D242 /* Embed Watch Content */,
DDD002DDD002DDD002DDD002 /* Embed App Extensions */,
);
buildRules = (
);
dependencies = (
08E32451A0A32FD65422174D /* PBXTargetDependency */,
GGG001GGG001GGG001GGG001 /* PBXTargetDependency */,
);
name = TabataGo;
packageProductDependencies = (
@@ -661,6 +750,7 @@
D77CBB3569E06BDB4239862D /* TabataGoUITests */,
3945C3998B4B66F30759718C /* TabataGoWatch */,
90BAF2DB5D7456CD45975E26 /* TabataGoWatchWidget */,
EEE001EEE001EEE001EEE001 /* TabataGoWidget */,
);
};
/* End PBXProject section */
@@ -734,8 +824,10 @@
53FDC12EFCD8159045C105C0 /* HealthKitService.swift in Sources */,
5CE2F2210BEF17AC304F2AC2 /* HealthSnapshot.swift in Sources */,
FE14257B8CFFDC47C72AE079 /* HealthViewModel.swift in Sources */,
F2E1D0C9B8A7F6E5D4C3B2A1 /* ZoneHighlightIcon.swift in Sources */,
59B482DEBAA43EE5F24B883D /* HomeTab.swift in Sources */,
E4ED0B8CABBD3502EA468F21 /* HomeViewModel.swift in Sources */,
5B01ABC32F9B8FFD006E707D /* MusicActivityAttributes.swift in Sources */,
14EC768D950BC071AFBEFDF2 /* MainTabView.swift in Sources */,
5A402D7E31059AB7107B625C /* MusicPlayerViewModel.swift in Sources */,
09285D4F326731E9A27827B2 /* MusicService.swift in Sources */,
@@ -766,6 +858,19 @@
996E613C0A9906AB88D2AEB6 /* WorkoutCalendarView.swift in Sources */,
1955D0D74D9B09D10705104C /* WorkoutProgram.swift in Sources */,
192F8CFFE1888005ABF339E8 /* WorkoutSession.swift in Sources */,
AAA005AAA005AAA005AAA005 /* WorkoutActivityAttributes.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
DDD001DDD001DDD001DDD001 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
AAA001AAA001AAA001AAA001 /* MusicActivityAttributes.swift in Sources */,
AAA002AAA002AAA002AAA002 /* MusicLiveActivity.swift in Sources */,
AAA003AAA003AAA003AAA003 /* TabataGoWidgetBundle.swift in Sources */,
AAA006AAA006AAA006AAA006 /* WorkoutActivityAttributes.swift in Sources */,
AAA007AAA007AAA007AAA007 /* WorkoutLiveActivity.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -800,6 +905,11 @@
target = 90BAF2DB5D7456CD45975E26 /* TabataGoWatchWidget */;
targetProxy = D329F349FC6AF0E2D3C89FD3 /* PBXContainerItemProxy */;
};
GGG001GGG001GGG001GGG001 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = EEE001EEE001EEE001EEE001 /* TabataGoWidget */;
targetProxy = FFF001FFF001FFF001FFF001 /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
/* Begin XCBuildConfiguration section */
@@ -1102,6 +1212,47 @@
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
HHH001HHH001HHH001HHH001 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_IDENTITY = "iPhone Developer";
DEVELOPMENT_TEAM = 2MJF39L8VY;
INFOPLIST_FILE = TabataGoWidget/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 26.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.tabatago.app.widget;
SKIP_INSTALL = YES;
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
HHH002HHH002HHH002HHH002 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_IDENTITY = "iPhone Developer";
DEVELOPMENT_TEAM = 2MJF39L8VY;
INFOPLIST_FILE = TabataGoWidget/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 26.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.tabatago.app.widget;
SKIP_INSTALL = YES;
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
569F5B8F2ACCAC8356B6D8A0 /* Build configuration list for PBXNativeTarget "TabataGoWatchWidget" */ = {
isa = XCConfigurationList;
@@ -1157,6 +1308,15 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Debug;
};
III001III001III001III001 /* Build configuration list for PBXNativeTarget "TabataGoWidget" */ = {
isa = XCConfigurationList;
buildConfigurations = (
HHH001HHH001HHH001HHH001 /* Debug */,
HHH002HHH002HHH002HHH002 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Debug;
};
/* End XCConfigurationList section */
/* Begin XCRemoteSwiftPackageReference section */