@sriinnu/runic 1.2.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (342) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/README.md +8 -1
  3. package/RuniciOS/Core/RunicTypographyiOS.swift +24 -0
  4. package/RuniciOS/Views/ProviderDetailView.swift +9 -9
  5. package/RuniciOS/Views/ProviderListView.swift +10 -10
  6. package/RuniciOS/Widgets/LargeWidget.swift +14 -14
  7. package/RuniciOS/Widgets/LiveActivity.swift +19 -19
  8. package/RuniciOS/Widgets/LockScreenWidget.swift +15 -15
  9. package/RuniciOS/Widgets/MediumWidget.swift +10 -10
  10. package/RuniciOS/Widgets/RunicWidget.swift +5 -5
  11. package/RuniciOS/Widgets/SmallWidget.swift +9 -9
  12. package/Sources/Runic/About.swift +3 -3
  13. package/Sources/Runic/AppNotifications.swift +5 -3
  14. package/Sources/Runic/Controllers/StatusItemController+Actions.swift +7 -3
  15. package/Sources/Runic/Controllers/StatusItemController+Animation.swift +5 -4
  16. package/Sources/Runic/Controllers/StatusItemController+ChartSubmenus.swift +30 -16
  17. package/Sources/Runic/Controllers/StatusItemController+CustomProviders.swift +6 -3
  18. package/Sources/Runic/Controllers/StatusItemController+Menu.swift +18 -13
  19. package/Sources/Runic/Controllers/StatusItemController+MenuCards.swift +6 -4
  20. package/Sources/Runic/Controllers/StatusItemController+MenuHelpers.swift +40 -12
  21. package/Sources/Runic/Controllers/StatusItemController.swift +43 -43
  22. package/Sources/Runic/Core/BudgetNotificationManager.swift +2 -1
  23. package/Sources/Runic/Core/Login/ClaudeLoginRunner.swift +2 -2
  24. package/Sources/Runic/Core/Login/CodexLoginRunner.swift +1 -1
  25. package/Sources/Runic/Core/Login/CursorLoginRunner.swift +4 -4
  26. package/Sources/Runic/Core/Login/GeminiLoginRunner.swift +1 -1
  27. package/Sources/Runic/Core/Rendering/IconRenderer.swift +91 -85
  28. package/Sources/Runic/Core/Rendering/IconView.swift +3 -1
  29. package/Sources/Runic/Core/RunicColors.swift +6 -6
  30. package/Sources/Runic/Core/RunicSpacing.swift +7 -7
  31. package/Sources/Runic/Core/RunicTypography.swift +206 -0
  32. package/Sources/Runic/Core/Stores/AuggieTokenStore.swift +1 -3
  33. package/Sources/Runic/Core/Stores/AzureOpenAITokenStore.swift +1 -3
  34. package/Sources/Runic/Core/Stores/CerebrasTokenStore.swift +1 -3
  35. package/Sources/Runic/Core/Stores/CohereTokenStore.swift +1 -3
  36. package/Sources/Runic/Core/Stores/CopilotTokenStore.swift +1 -3
  37. package/Sources/Runic/Core/Stores/CustomProviderStore.swift +10 -10
  38. package/Sources/Runic/Core/Stores/DeepSeekTokenStore.swift +1 -3
  39. package/Sources/Runic/Core/Stores/FireworksTokenStore.swift +1 -3
  40. package/Sources/Runic/Core/Stores/GroqTokenStore.swift +1 -3
  41. package/Sources/Runic/Core/Stores/KimiTokenStore.swift +1 -3
  42. package/Sources/Runic/Core/Stores/MiniMaxCookieHeaderStore.swift +1 -3
  43. package/Sources/Runic/Core/Stores/MiniMaxGroupIDStore.swift +1 -3
  44. package/Sources/Runic/Core/Stores/MiniMaxTokenStore.swift +1 -3
  45. package/Sources/Runic/Core/Stores/MistralTokenStore.swift +1 -3
  46. package/Sources/Runic/Core/Stores/OpenRouterTokenStore.swift +1 -3
  47. package/Sources/Runic/Core/Stores/PerplexityTokenStore.swift +1 -3
  48. package/Sources/Runic/Core/Stores/ProviderToggleStore.swift +1 -1
  49. package/Sources/Runic/Core/Stores/QwenTokenStore.swift +1 -3
  50. package/Sources/Runic/Core/Stores/SambaNovaTokenStore.swift +1 -3
  51. package/Sources/Runic/Core/Stores/SettingsStore.swift +89 -51
  52. package/Sources/Runic/Core/Stores/TogetherTokenStore.swift +1 -3
  53. package/Sources/Runic/Core/Stores/UsageStore+Accessors.swift +19 -6
  54. package/Sources/Runic/Core/Stores/UsageStore+TokenCost.swift +1 -1
  55. package/Sources/Runic/Core/Stores/UsageStore+WidgetSnapshot.swift +1 -1
  56. package/Sources/Runic/Core/Stores/UsageStore.swift +187 -161
  57. package/Sources/Runic/Core/Stores/XAITokenStore.swift +1 -3
  58. package/Sources/Runic/Core/Stores/ZaiTokenStore.swift +1 -2
  59. package/Sources/Runic/Core/UsageExporter.swift +8 -4
  60. package/Sources/Runic/ProviderRegistry.swift +1 -1
  61. package/Sources/Runic/Providers/Antigravity/AntigravityProviderImplementation.swift +1 -1
  62. package/Sources/Runic/Providers/Auggie/AuggieProviderImplementation.swift +1 -1
  63. package/Sources/Runic/Providers/Azure/AzureProviderImplementation.swift +1 -1
  64. package/Sources/Runic/Providers/Bedrock/BedrockProviderImplementation.swift +1 -1
  65. package/Sources/Runic/Providers/Cerebras/CerebrasProviderImplementation.swift +1 -1
  66. package/Sources/Runic/Providers/Codex/CodexProviderImplementation.swift +1 -1
  67. package/Sources/Runic/Providers/Cohere/CohereProviderImplementation.swift +1 -1
  68. package/Sources/Runic/Providers/Cursor/CursorProviderImplementation.swift +1 -1
  69. package/Sources/Runic/Providers/DeepSeek/DeepSeekProviderImplementation.swift +1 -1
  70. package/Sources/Runic/Providers/Factory/FactoryProviderImplementation.swift +1 -1
  71. package/Sources/Runic/Providers/Fireworks/FireworksProviderImplementation.swift +1 -1
  72. package/Sources/Runic/Providers/Gemini/GeminiProviderImplementation.swift +1 -1
  73. package/Sources/Runic/Providers/Groq/GroqProviderImplementation.swift +1 -1
  74. package/Sources/Runic/Providers/Kimi/KimiProviderImplementation.swift +1 -1
  75. package/Sources/Runic/Providers/MiniMax/MiniMaxProviderImplementation.swift +1 -1
  76. package/Sources/Runic/Providers/Mistral/MistralProviderImplementation.swift +1 -1
  77. package/Sources/Runic/Providers/OpenRouter/OpenRouterProviderImplementation.swift +1 -1
  78. package/Sources/Runic/Providers/Perplexity/PerplexityProviderImplementation.swift +1 -1
  79. package/Sources/Runic/Providers/SambaNova/SambaNovaProviderImplementation.swift +1 -1
  80. package/Sources/Runic/Providers/Shared/ProviderImplementation.swift +5 -2
  81. package/Sources/Runic/Providers/Shared/ProviderImplementationRegistry.swift +1 -1
  82. package/Sources/Runic/Providers/Shared/ProviderSettingsDescriptors.swift +1 -1
  83. package/Sources/Runic/Providers/Together/TogetherProviderImplementation.swift +1 -1
  84. package/Sources/Runic/Providers/XAI/XAIProviderImplementation.swift +1 -1
  85. package/Sources/Runic/Providers/Zai/ZaiProviderImplementation.swift +1 -1
  86. package/Sources/Runic/Resources/Fonts/Caveat-Bold.ttf +0 -0
  87. package/Sources/Runic/Resources/Fonts/Caveat-Regular.ttf +0 -0
  88. package/Sources/Runic/Resources/Fonts/FiraCode-Bold.ttf +0 -0
  89. package/Sources/Runic/Resources/Fonts/FiraCode-Light.ttf +0 -0
  90. package/Sources/Runic/Resources/Fonts/FiraCode-Medium.ttf +0 -0
  91. package/Sources/Runic/Resources/Fonts/FiraCode-Regular.ttf +0 -0
  92. package/Sources/Runic/Resources/Fonts/FiraCode-SemiBold.ttf +0 -0
  93. package/Sources/Runic/Resources/Fonts/IBMPlexMono-Bold.ttf +0 -0
  94. package/Sources/Runic/Resources/Fonts/IBMPlexMono-Medium.ttf +0 -0
  95. package/Sources/Runic/Resources/Fonts/IBMPlexMono-Regular.ttf +0 -0
  96. package/Sources/Runic/Resources/Fonts/IBMPlexMono-SemiBold.ttf +0 -0
  97. package/Sources/Runic/Resources/Fonts/Inconsolata-Bold.ttf +0 -0
  98. package/Sources/Runic/Resources/Fonts/Inconsolata-Medium.ttf +0 -0
  99. package/Sources/Runic/Resources/Fonts/Inconsolata-Regular.ttf +0 -0
  100. package/Sources/Runic/Resources/Fonts/Inconsolata-SemiBold.ttf +0 -0
  101. package/Sources/Runic/Resources/Fonts/JetBrainsMono-Bold.ttf +0 -0
  102. package/Sources/Runic/Resources/Fonts/JetBrainsMono-Medium.ttf +0 -0
  103. package/Sources/Runic/Resources/Fonts/JetBrainsMono-Regular.ttf +0 -0
  104. package/Sources/Runic/Resources/Fonts/JetBrainsMono-SemiBold.ttf +0 -0
  105. package/Sources/Runic/Resources/Fonts/SpaceMono-Bold.ttf +0 -0
  106. package/Sources/Runic/Resources/Fonts/SpaceMono-Regular.ttf +0 -0
  107. package/Sources/Runic/RunicApp.swift +46 -36
  108. package/Sources/Runic/SessionQuotaNotifications.swift +2 -2
  109. package/Sources/Runic/UsagePaceText.swift +1 -1
  110. package/Sources/Runic/UsageProgressBar.swift +13 -9
  111. package/Sources/Runic/Utilities/LoadingPattern.swift +4 -2
  112. package/Sources/Runic/Utilities/PerformanceConstants.swift +28 -28
  113. package/Sources/Runic/Views/Menu/AlertsMenuView.swift +19 -21
  114. package/Sources/Runic/Views/Menu/CostComparativeChartMenuView.swift +19 -19
  115. package/Sources/Runic/Views/Menu/CostHistoryChartMenuView.swift +7 -7
  116. package/Sources/Runic/Views/Menu/CreditsHistoryChartMenuView.swift +5 -5
  117. package/Sources/Runic/Views/Menu/EfficiencyMetricsMenuView.swift +29 -30
  118. package/Sources/Runic/Views/Menu/HeroStatCardsMenuView.swift +20 -17
  119. package/Sources/Runic/Views/Menu/HourlyActivityChartMenuView.swift +14 -14
  120. package/Sources/Runic/Views/Menu/InlineUsageChartView.swift +12 -10
  121. package/Sources/Runic/Views/Menu/MenuCardEntranceModifier.swift +3 -4
  122. package/Sources/Runic/Views/Menu/MenuCardSidebarView.swift +5 -25
  123. package/Sources/Runic/Views/Menu/MenuCardSkeletonView.swift +1 -1
  124. package/Sources/Runic/Views/Menu/MenuCardView.swift +120 -131
  125. package/Sources/Runic/Views/Menu/MenuContent.swift +11 -8
  126. package/Sources/Runic/Views/Menu/MenuDescriptor.swift +4 -2
  127. package/Sources/Runic/Views/Menu/MenuHighlightStyle.swift +1 -8
  128. package/Sources/Runic/Views/Menu/ModelBreakdownMenuView.swift +20 -14
  129. package/Sources/Runic/Views/Menu/OverviewMenuView.swift +18 -15
  130. package/Sources/Runic/Views/Menu/ProjectBreakdownMenuView.swift +16 -11
  131. package/Sources/Runic/Views/Menu/ProjectBudgetMenuView.swift +27 -27
  132. package/Sources/Runic/Views/Menu/ProviderTabBarView.swift +4 -6
  133. package/Sources/Runic/Views/Menu/SubscriptionUtilizationChartMenuView.swift +24 -11
  134. package/Sources/Runic/Views/Menu/UsageBreakdownChartMenuView.swift +5 -5
  135. package/Sources/Runic/Views/Menu/UsageHeatmapMenuView.swift +7 -8
  136. package/Sources/Runic/Views/Menu/UsageTimelineChartMenuView.swift +22 -17
  137. package/Sources/Runic/Views/Menu/UsageWindowComparisonChartMenuView.swift +8 -7
  138. package/Sources/Runic/Views/Menu/WeeklyActivityChartMenuView.swift +7 -7
  139. package/Sources/Runic/Views/Performance/PerformanceDashboardView.swift +50 -47
  140. package/Sources/Runic/Views/Preferences/LiquidComponents.swift +15 -14
  141. package/Sources/Runic/Views/Preferences/PreferencesAboutPane.swift +7 -7
  142. package/Sources/Runic/Views/Preferences/PreferencesAdvancedPane.swift +27 -27
  143. package/Sources/Runic/Views/Preferences/PreferencesAlertsPane.swift +38 -42
  144. package/Sources/Runic/Views/Preferences/PreferencesAnalyticsPane.swift +39 -43
  145. package/Sources/Runic/Views/Preferences/PreferencesBudgetsPane.swift +21 -21
  146. package/Sources/Runic/Views/Preferences/PreferencesComponents.swift +7 -7
  147. package/Sources/Runic/Views/Preferences/PreferencesCustomProvidersPane.swift +49 -50
  148. package/Sources/Runic/Views/Preferences/PreferencesDebugPane.swift +10 -10
  149. package/Sources/Runic/Views/Preferences/PreferencesGeneralPane.swift +40 -21
  150. package/Sources/Runic/Views/Preferences/PreferencesHelpPane.swift +7 -7
  151. package/Sources/Runic/Views/Preferences/PreferencesIntegrationsPane.swift +44 -39
  152. package/Sources/Runic/Views/Preferences/PreferencesPerformancePane.swift +26 -23
  153. package/Sources/Runic/Views/Preferences/PreferencesProvidersPane.swift +271 -226
  154. package/Sources/Runic/Views/Preferences/PreferencesSelection.swift +6 -2
  155. package/Sources/Runic/Views/Preferences/PreferencesSyncPane.swift +7 -5
  156. package/Sources/Runic/Views/Preferences/PreferencesView.swift +38 -31
  157. package/Sources/Runic/Views/Rating/QualityRatingView.swift +11 -11
  158. package/Sources/Runic/Views/Team/TeamDashboardView.swift +29 -24
  159. package/Sources/Runic/Views/Team/TeamInviteSheet.swift +16 -16
  160. package/Sources/Runic/Views/Team/TeamManagementView.swift +50 -49
  161. package/Sources/Runic/Views/Team/TeamMemberRow.swift +8 -8
  162. package/Sources/RunicCLI/CLIEntry.swift +83 -42
  163. package/Sources/RunicCLI/CLIRenderer.swift +1 -1
  164. package/Sources/RunicCLI/Commands/EnhancedUsageCommand.swift +60 -60
  165. package/Sources/RunicCLI/Commands/ModelsCommand.swift +45 -44
  166. package/Sources/RunicCLI/Commands/ProjectsCommand.swift +83 -69
  167. package/Sources/RunicCLI/Commands/ResetCommand.swift +50 -49
  168. package/Sources/RunicCLI/Commands/UsageLedgerSourceFactory.swift +31 -32
  169. package/Sources/RunicClaudeWebProbe/main.swift +1 -1
  170. package/Sources/RunicCore/AlertRuleStore.swift +20 -20
  171. package/Sources/RunicCore/BrowserCookieImportOrder.swift +3 -3
  172. package/Sources/RunicCore/CostUsageModels.swift +1 -1
  173. package/Sources/RunicCore/CustomProviders/CustomProviderModels.swift +29 -30
  174. package/Sources/RunicCore/CustomProviders/GenericProviderFetcher.swift +73 -75
  175. package/Sources/RunicCore/CustomProviders/ProviderTemplates.swift +53 -109
  176. package/Sources/RunicCore/Host/PTY/TTYCommandRunner.swift +3 -3
  177. package/Sources/RunicCore/Integrations/GitHubIntegration.swift +3 -3
  178. package/Sources/RunicCore/Models/EnhancedUsageModels.swift +47 -48
  179. package/Sources/RunicCore/OpenAIWeb/OpenAIDashboardBrowserCookieImporter.swift +1 -1
  180. package/Sources/RunicCore/OpenAIWeb/OpenAIDashboardFetcher.swift +1 -1
  181. package/Sources/RunicCore/Performance/PerformanceModels.swift +4 -4
  182. package/Sources/RunicCore/Performance/PerformanceStorageImpl.swift +81 -64
  183. package/Sources/RunicCore/Policy/UsagePolicyEngine.swift +2 -2
  184. package/Sources/RunicCore/ProjectBudgetStore.swift +15 -12
  185. package/Sources/RunicCore/Providers/Antigravity/AntigravityProviderDescriptor.swift +4 -2
  186. package/Sources/RunicCore/Providers/Antigravity/AntigravityStatusProbe.swift +2 -2
  187. package/Sources/RunicCore/Providers/Auggie/AuggieProviderDescriptor.swift +2 -2
  188. package/Sources/RunicCore/Providers/Auggie/AuggieUsageFetcher.swift +3 -3
  189. package/Sources/RunicCore/Providers/Azure/AzureProviderDescriptor.swift +8 -8
  190. package/Sources/RunicCore/Providers/Azure/AzureUsageFetcher.swift +3 -3
  191. package/Sources/RunicCore/Providers/Bedrock/BedrockProviderDescriptor.swift +6 -6
  192. package/Sources/RunicCore/Providers/Bedrock/BedrockUsageFetcher.swift +3 -7
  193. package/Sources/RunicCore/Providers/Cerebras/CerebrasProviderDescriptor.swift +2 -2
  194. package/Sources/RunicCore/Providers/Cerebras/CerebrasUsageFetcher.swift +2 -2
  195. package/Sources/RunicCore/Providers/Claude/ClaudeOAuth/ClaudeOAuthUsageFetcher.swift +3 -3
  196. package/Sources/RunicCore/Providers/Claude/ClaudeProviderDescriptor.swift +4 -2
  197. package/Sources/RunicCore/Providers/Claude/ClaudeStatusProbe.swift +4 -4
  198. package/Sources/RunicCore/Providers/Claude/ClaudeUsageDataSource.swift +3 -1
  199. package/Sources/RunicCore/Providers/Claude/ClaudeWeb/ClaudeWebAPIFetcher.swift +1 -1
  200. package/Sources/RunicCore/Providers/Codex/CodexOAuth/CodexOAuthUsageFetcher.swift +1 -1
  201. package/Sources/RunicCore/Providers/Codex/CodexProviderDescriptor.swift +4 -2
  202. package/Sources/RunicCore/Providers/Codex/CodexUsageDataSource.swift +3 -1
  203. package/Sources/RunicCore/Providers/Codex/CodexWebDashboardStrategy.swift +5 -3
  204. package/Sources/RunicCore/Providers/Cohere/CohereProviderDescriptor.swift +2 -2
  205. package/Sources/RunicCore/Providers/Cohere/CohereUsageFetcher.swift +3 -3
  206. package/Sources/RunicCore/Providers/Copilot/CopilotGitHubCLITokenReader.swift +7 -4
  207. package/Sources/RunicCore/Providers/Copilot/CopilotProviderDescriptor.swift +4 -4
  208. package/Sources/RunicCore/Providers/Copilot/CopilotUsageFetcher.swift +5 -3
  209. package/Sources/RunicCore/Providers/Copilot/CopilotVSCodeTokenReader.swift +9 -10
  210. package/Sources/RunicCore/Providers/Cursor/CursorProviderDescriptor.swift +4 -2
  211. package/Sources/RunicCore/Providers/DeepSeek/DeepSeekProviderDescriptor.swift +2 -2
  212. package/Sources/RunicCore/Providers/DeepSeek/DeepSeekUsageFetcher.swift +2 -2
  213. package/Sources/RunicCore/Providers/Factory/FactoryLocalStorageImporter.swift +4 -4
  214. package/Sources/RunicCore/Providers/Factory/FactoryProviderDescriptor.swift +4 -2
  215. package/Sources/RunicCore/Providers/Factory/FactoryStatusProbe.swift +2 -2
  216. package/Sources/RunicCore/Providers/Fireworks/FireworksProviderDescriptor.swift +2 -2
  217. package/Sources/RunicCore/Providers/Fireworks/FireworksUsageFetcher.swift +2 -2
  218. package/Sources/RunicCore/Providers/Gemini/GeminiProviderDescriptor.swift +4 -2
  219. package/Sources/RunicCore/Providers/Gemini/GeminiStatusProbe.swift +5 -2
  220. package/Sources/RunicCore/Providers/Groq/GroqProviderDescriptor.swift +2 -2
  221. package/Sources/RunicCore/Providers/Groq/GroqUsageFetcher.swift +2 -2
  222. package/Sources/RunicCore/Providers/Kimi/KimiProviderDescriptor.swift +2 -2
  223. package/Sources/RunicCore/Providers/Kimi/KimiUsageFetcher.swift +2 -2
  224. package/Sources/RunicCore/Providers/MiniMax/MiniMaxProviderDescriptor.swift +10 -5
  225. package/Sources/RunicCore/Providers/MiniMax/MiniMaxUsageFetcher.swift +7 -7
  226. package/Sources/RunicCore/Providers/MiniMax/MiniMaxWebUsageFetcher.swift +10 -10
  227. package/Sources/RunicCore/Providers/Mistral/MistralProviderDescriptor.swift +2 -2
  228. package/Sources/RunicCore/Providers/Mistral/MistralUsageFetcher.swift +2 -2
  229. package/Sources/RunicCore/Providers/OpenRouter/OpenRouterProviderDescriptor.swift +2 -2
  230. package/Sources/RunicCore/Providers/OpenRouter/OpenRouterUsageFetcher.swift +23 -10
  231. package/Sources/RunicCore/Providers/Perplexity/PerplexityProviderDescriptor.swift +2 -2
  232. package/Sources/RunicCore/Providers/Perplexity/PerplexityUsageFetcher.swift +2 -2
  233. package/Sources/RunicCore/Providers/ProviderFetchPlan.swift +2 -2
  234. package/Sources/RunicCore/Providers/ProviderTokenResolver.swift +2 -2
  235. package/Sources/RunicCore/Providers/Qwen/QwenProviderDescriptor.swift +5 -3
  236. package/Sources/RunicCore/Providers/Qwen/QwenUsageStats.swift +26 -13
  237. package/Sources/RunicCore/Providers/SambaNova/SambaNovaProviderDescriptor.swift +2 -2
  238. package/Sources/RunicCore/Providers/SambaNova/SambaNovaUsageFetcher.swift +2 -2
  239. package/Sources/RunicCore/Providers/Together/TogetherProviderDescriptor.swift +2 -2
  240. package/Sources/RunicCore/Providers/Together/TogetherUsageFetcher.swift +2 -2
  241. package/Sources/RunicCore/Providers/VertexAI/VertexAIProviderDescriptor.swift +5 -5
  242. package/Sources/RunicCore/Providers/VertexAI/VertexAISettingsReader.swift +1 -1
  243. package/Sources/RunicCore/Providers/VertexAI/VertexAIUsageFetcher.swift +3 -3
  244. package/Sources/RunicCore/Providers/XAI/XAIProviderDescriptor.swift +2 -2
  245. package/Sources/RunicCore/Providers/XAI/XAIUsageFetcher.swift +2 -2
  246. package/Sources/RunicCore/Providers/Zai/ZaiProviderDescriptor.swift +4 -2
  247. package/Sources/RunicCore/Providers/Zai/ZaiUsageStats.swift +48 -21
  248. package/Sources/RunicCore/Sync/BackgroundSyncManager.swift +76 -77
  249. package/Sources/RunicCore/Sync/SyncConflictResolver.swift +55 -58
  250. package/Sources/RunicCore/Sync/SyncProtocol.swift +21 -22
  251. package/Sources/RunicCore/Sync/SyncRecord.swift +46 -49
  252. package/Sources/RunicCore/Sync/SyncUsageExample.swift +44 -50
  253. package/Sources/RunicCore/Sync/TeamSyncRecords.swift +94 -101
  254. package/Sources/RunicCore/Sync/iCloudSyncEngine.swift +51 -46
  255. package/Sources/RunicCore/Team/TeamModels.swift +111 -110
  256. package/Sources/RunicCore/Team/TeamStore.swift +126 -109
  257. package/Sources/RunicCore/UsageFetcher.swift +2 -2
  258. package/Sources/RunicCore/UsageFormatter.swift +25 -25
  259. package/Sources/RunicCore/UsageLedger/ClaudeUsageLogSource.swift +27 -13
  260. package/Sources/RunicCore/UsageLedger/CodexUsageLogSource.swift +11 -3
  261. package/Sources/RunicCore/UsageLedger/LedgerCache.swift +5 -2
  262. package/Sources/RunicCore/UsageLedger/OTelGenAILedgerAdapter.swift +1 -1
  263. package/Sources/RunicCore/UsageLedger/UsageLedgerAggregator.swift +40 -25
  264. package/Sources/RunicCore/UsageLedger/UsageLedgerInsightsAdvisor.swift +1 -1
  265. package/Sources/RunicCore/UsageLedger/UsageLedgerProjectIdentity.swift +55 -16
  266. package/Sources/RunicCore/Vendored/CostUsage/CostUsageCache.swift +6 -6
  267. package/Sources/RunicCore/Vendored/CostUsage/CostUsageJsonl.swift +1 -1
  268. package/Sources/RunicCore/Vendored/CostUsage/CostUsagePricing.swift +2 -2
  269. package/Sources/RunicCore/Vendored/CostUsage/CostUsageScanner.swift +5 -5
  270. package/Tests/RunicTests/AppDelegateTests.swift +8 -3
  271. package/Tests/RunicTests/BrowserCookieOrderLabelTests.swift +2 -3
  272. package/Tests/RunicTests/CLIArgumentParsingTests.swift +3 -4
  273. package/Tests/RunicTests/CLICostTests.swift +6 -7
  274. package/Tests/RunicTests/CLIProviderSelectionTests.swift +2 -3
  275. package/Tests/RunicTests/CLISnapshotTests.swift +3 -4
  276. package/Tests/RunicTests/CLIWebFallbackTests.swift +3 -4
  277. package/Tests/RunicTests/ClaudeOAuthTests.swift +11 -12
  278. package/Tests/RunicTests/ClaudeResilienceTests.swift +3 -4
  279. package/Tests/RunicTests/ClaudeUsageTests.swift +20 -21
  280. package/Tests/RunicTests/CodexOAuthTests.swift +7 -8
  281. package/Tests/RunicTests/CodexUsageLogSourceTests.swift +1 -3
  282. package/Tests/RunicTests/CopilotTokenResolverTests.swift +5 -6
  283. package/Tests/RunicTests/CopilotVSCodeTokenReaderTests.swift +4 -5
  284. package/Tests/RunicTests/CostUsageDecodingTests.swift +15 -17
  285. package/Tests/RunicTests/CostUsagePricingTests.swift +5 -7
  286. package/Tests/RunicTests/CostUsageScannerTests.swift +10 -12
  287. package/Tests/RunicTests/CursorStatusProbeTests.swift +15 -16
  288. package/Tests/RunicTests/FactoryStatusProbeTests.swift +3 -5
  289. package/Tests/RunicTests/GeminiLoginAlertTests.swift +3 -4
  290. package/Tests/RunicTests/GeminiStatusProbeAPITests.swift +11 -11
  291. package/Tests/RunicTests/GeminiStatusProbePlanTests.swift +8 -8
  292. package/Tests/RunicTests/GeminiStatusProbeTests.swift +20 -21
  293. package/Tests/RunicTests/GoogleWorkspaceStatusTests.swift +2 -3
  294. package/Tests/RunicTests/InstallOriginTests.swift +1 -2
  295. package/Tests/RunicTests/KeyboardShortcutsBundleTests.swift +2 -2
  296. package/Tests/RunicTests/LiveAccountTests.swift +3 -3
  297. package/Tests/RunicTests/LoadingPatternTests.swift +3 -4
  298. package/Tests/RunicTests/MenuCardModelTests.swift +33 -34
  299. package/Tests/RunicTests/MiniMaxCookieHeaderStoreTestSupport.swift +4 -1
  300. package/Tests/RunicTests/MiniMaxGroupIDStoreTestSupport.swift +4 -1
  301. package/Tests/RunicTests/MiniMaxParsingTests.swift +4 -5
  302. package/Tests/RunicTests/MiniMaxTokenStoreTestSupport.swift +4 -1
  303. package/Tests/RunicTests/OTelGenAILedgerAdapterTests.swift +4 -6
  304. package/Tests/RunicTests/OpenAIDashboardBrowserCookieImporterTests.swift +1 -2
  305. package/Tests/RunicTests/OpenAIDashboardFetcherCreditsWaitTests.swift +5 -6
  306. package/Tests/RunicTests/OpenAIDashboardOffscreenHostTests.swift +2 -3
  307. package/Tests/RunicTests/OpenAIDashboardParserTests.swift +12 -13
  308. package/Tests/RunicTests/OpenAIWebAccountSwitchTests.swift +17 -6
  309. package/Tests/RunicTests/OpenRouterTokenStoreTestSupport.swift +52 -13
  310. package/Tests/RunicTests/PathBuilderTests.swift +14 -15
  311. package/Tests/RunicTests/ProviderFetchPipelineTests.swift +3 -4
  312. package/Tests/RunicTests/ProviderIconResourcesTests.swift +1 -2
  313. package/Tests/RunicTests/ProviderMetadataStatusLinkTests.swift +1 -2
  314. package/Tests/RunicTests/ProviderSettingsDescriptorTests.swift +53 -19
  315. package/Tests/RunicTests/ProviderToggleStoreTests.swift +10 -11
  316. package/Tests/RunicTests/RunicTests.swift +6 -7
  317. package/Tests/RunicTests/SessionQuotaNotificationLogicTests.swift +5 -6
  318. package/Tests/RunicTests/SettingsStoreTests.swift +149 -45
  319. package/Tests/RunicTests/StatusItemAnimationTests.swift +8 -3
  320. package/Tests/RunicTests/StatusMenuTests.swift +63 -22
  321. package/Tests/RunicTests/StatusProbeTests.swift +28 -29
  322. package/Tests/RunicTests/SubprocessRunnerTests.swift +1 -3
  323. package/Tests/RunicTests/SubscriptionDetectionTests.swift +8 -9
  324. package/Tests/RunicTests/TTYCommandRunnerTests.swift +8 -9
  325. package/Tests/RunicTests/TeamShowbackExporterTests.swift +2 -4
  326. package/Tests/RunicTests/TextParsingTests.swift +1 -2
  327. package/Tests/RunicTests/UsageFormatterTests.swift +15 -16
  328. package/Tests/RunicTests/UsageLedgerAnomalyDetectionTests.swift +12 -14
  329. package/Tests/RunicTests/UsageLedgerForecastTests.swift +4 -6
  330. package/Tests/RunicTests/UsageLedgerInsightsAdvisorTests.swift +7 -9
  331. package/Tests/RunicTests/UsageLedgerProjectNameTests.swift +6 -8
  332. package/Tests/RunicTests/UsagePaceTests.swift +5 -6
  333. package/Tests/RunicTests/UsagePaceTextTests.swift +8 -9
  334. package/Tests/RunicTests/UsagePolicyEngineTests.swift +3 -5
  335. package/Tests/RunicTests/WidgetSnapshotTests.swift +1 -3
  336. package/Tests/RunicTests/ZaiProviderTests.swift +3 -5
  337. package/Tests/RunicTests/ZaiTokenStoreTestSupport.swift +4 -1
  338. package/appcast.xml +36 -76
  339. package/package.json +1 -1
  340. package/runic.png +0 -0
  341. package/runic.svg +15 -0
  342. package/version.env +2 -2
@@ -25,7 +25,9 @@ enum UsageExporter {
25
25
  var lines: [String] = []
26
26
 
27
27
  // Header
28
- lines.append("date,input_tokens,output_tokens,cache_creation_tokens,cache_read_tokens,total_tokens,cost_usd,models_used")
28
+ lines
29
+ .append(
30
+ "date,input_tokens,output_tokens,cache_creation_tokens,cache_read_tokens,total_tokens,cost_usd,models_used")
29
31
 
30
32
  // Daily summaries from token snapshot
31
33
  let daily = store.tokenSnapshot(for: provider)?.daily ?? []
@@ -45,7 +47,9 @@ enum UsageExporter {
45
47
  if daily.isEmpty, let summary = store.ledgerDailySummary(for: provider) {
46
48
  let costStr = summary.totals.costUSD.map { String(format: "%.4f", $0) } ?? ""
47
49
  let modelsStr = Self.csvEscape(summary.modelsUsed.joined(separator: "; "))
48
- lines.append("\(summary.dayKey),\(summary.totals.inputTokens),\(summary.totals.outputTokens),\(summary.totals.cacheCreationTokens),\(summary.totals.cacheReadTokens),\(summary.totals.totalTokens),\(costStr),\(modelsStr)")
50
+ lines
51
+ .append(
52
+ "\(summary.dayKey),\(summary.totals.inputTokens),\(summary.totals.outputTokens),\(summary.totals.cacheCreationTokens),\(summary.totals.cacheReadTokens),\(summary.totals.totalTokens),\(costStr),\(modelsStr)")
49
53
  }
50
54
 
51
55
  return lines.joined(separator: "\n")
@@ -172,8 +176,8 @@ enum UsageExporter {
172
176
  guard let data = try? JSONSerialization.data(
173
177
  withJSONObject: root,
174
178
  options: [.prettyPrinted, .sortedKeys]),
175
- let string = String(data: data, encoding: .utf8) else
176
- {
179
+ let string = String(data: data, encoding: .utf8)
180
+ else {
177
181
  return "{}"
178
182
  }
179
183
  return string
@@ -1,5 +1,5 @@
1
- import RunicCore
2
1
  import Foundation
2
+ import RunicCore
3
3
 
4
4
  struct ProviderSpec {
5
5
  let style: IconStyle
@@ -1,6 +1,6 @@
1
+ import Foundation
1
2
  import RunicCore
2
3
  import RunicMacroSupport
3
- import Foundation
4
4
 
5
5
  @ProviderImplementationRegistration
6
6
  struct AntigravityProviderImplementation: ProviderImplementation {
@@ -1,7 +1,7 @@
1
1
  import AppKit
2
+ import Foundation
2
3
  import RunicCore
3
4
  import RunicMacroSupport
4
- import Foundation
5
5
 
6
6
  @ProviderImplementationRegistration
7
7
  struct AuggieProviderImplementation: ProviderImplementation {
@@ -1,7 +1,7 @@
1
1
  import AppKit
2
+ import Foundation
2
3
  import RunicCore
3
4
  import RunicMacroSupport
4
- import Foundation
5
5
 
6
6
  @ProviderImplementationRegistration
7
7
  struct AzureProviderImplementation: ProviderImplementation {
@@ -1,7 +1,7 @@
1
1
  import AppKit
2
+ import Foundation
2
3
  import RunicCore
3
4
  import RunicMacroSupport
4
- import Foundation
5
5
 
6
6
  @ProviderImplementationRegistration
7
7
  struct BedrockProviderImplementation: ProviderImplementation {
@@ -1,7 +1,7 @@
1
1
  import AppKit
2
+ import Foundation
2
3
  import RunicCore
3
4
  import RunicMacroSupport
4
- import Foundation
5
5
 
6
6
  @ProviderImplementationRegistration
7
7
  struct CerebrasProviderImplementation: ProviderImplementation {
@@ -1,6 +1,6 @@
1
+ import Foundation
1
2
  import RunicCore
2
3
  import RunicMacroSupport
3
- import Foundation
4
4
 
5
5
  @ProviderImplementationRegistration
6
6
  struct CodexProviderImplementation: ProviderImplementation {
@@ -1,7 +1,7 @@
1
1
  import AppKit
2
+ import Foundation
2
3
  import RunicCore
3
4
  import RunicMacroSupport
4
- import Foundation
5
5
 
6
6
  @ProviderImplementationRegistration
7
7
  struct CohereProviderImplementation: ProviderImplementation {
@@ -1,6 +1,6 @@
1
+ import Foundation
1
2
  import RunicCore
2
3
  import RunicMacroSupport
3
- import Foundation
4
4
 
5
5
  @ProviderImplementationRegistration
6
6
  struct CursorProviderImplementation: ProviderImplementation {
@@ -1,7 +1,7 @@
1
1
  import AppKit
2
+ import Foundation
2
3
  import RunicCore
3
4
  import RunicMacroSupport
4
- import Foundation
5
5
 
6
6
  @ProviderImplementationRegistration
7
7
  struct DeepSeekProviderImplementation: ProviderImplementation {
@@ -1,6 +1,6 @@
1
+ import Foundation
1
2
  import RunicCore
2
3
  import RunicMacroSupport
3
- import Foundation
4
4
 
5
5
  @ProviderImplementationRegistration
6
6
  struct FactoryProviderImplementation: ProviderImplementation {
@@ -1,7 +1,7 @@
1
1
  import AppKit
2
+ import Foundation
2
3
  import RunicCore
3
4
  import RunicMacroSupport
4
- import Foundation
5
5
 
6
6
  @ProviderImplementationRegistration
7
7
  struct FireworksProviderImplementation: ProviderImplementation {
@@ -1,6 +1,6 @@
1
+ import Foundation
1
2
  import RunicCore
2
3
  import RunicMacroSupport
3
- import Foundation
4
4
 
5
5
  @ProviderImplementationRegistration
6
6
  struct GeminiProviderImplementation: ProviderImplementation {
@@ -1,7 +1,7 @@
1
1
  import AppKit
2
+ import Foundation
2
3
  import RunicCore
3
4
  import RunicMacroSupport
4
- import Foundation
5
5
 
6
6
  @ProviderImplementationRegistration
7
7
  struct GroqProviderImplementation: ProviderImplementation {
@@ -1,7 +1,7 @@
1
1
  import AppKit
2
+ import Foundation
2
3
  import RunicCore
3
4
  import RunicMacroSupport
4
- import Foundation
5
5
 
6
6
  @ProviderImplementationRegistration
7
7
  struct KimiProviderImplementation: ProviderImplementation {
@@ -1,6 +1,6 @@
1
+ import Foundation
1
2
  import RunicCore
2
3
  import RunicMacroSupport
3
- import Foundation
4
4
 
5
5
  @ProviderImplementationRegistration
6
6
  struct MiniMaxProviderImplementation: ProviderImplementation {
@@ -1,7 +1,7 @@
1
1
  import AppKit
2
+ import Foundation
2
3
  import RunicCore
3
4
  import RunicMacroSupport
4
- import Foundation
5
5
 
6
6
  @ProviderImplementationRegistration
7
7
  struct MistralProviderImplementation: ProviderImplementation {
@@ -1,7 +1,7 @@
1
1
  import AppKit
2
+ import Foundation
2
3
  import RunicCore
3
4
  import RunicMacroSupport
4
- import Foundation
5
5
 
6
6
  @ProviderImplementationRegistration
7
7
  struct OpenRouterProviderImplementation: ProviderImplementation {
@@ -1,7 +1,7 @@
1
1
  import AppKit
2
+ import Foundation
2
3
  import RunicCore
3
4
  import RunicMacroSupport
4
- import Foundation
5
5
 
6
6
  @ProviderImplementationRegistration
7
7
  struct PerplexityProviderImplementation: ProviderImplementation {
@@ -1,7 +1,7 @@
1
1
  import AppKit
2
+ import Foundation
2
3
  import RunicCore
3
4
  import RunicMacroSupport
4
- import Foundation
5
5
 
6
6
  @ProviderImplementationRegistration
7
7
  struct SambaNovaProviderImplementation: ProviderImplementation {
@@ -1,5 +1,5 @@
1
- import RunicCore
2
1
  import Foundation
2
+ import RunicCore
3
3
 
4
4
  /// App-side provider implementation.
5
5
  ///
@@ -26,7 +26,10 @@ protocol ProviderImplementation: Sendable {
26
26
  }
27
27
 
28
28
  extension ProviderImplementation {
29
- var supportsLoginFlow: Bool { false }
29
+ var supportsLoginFlow: Bool {
30
+ false
31
+ }
32
+
30
33
  @MainActor
31
34
  func settingsToggles(context _: ProviderSettingsContext) -> [ProviderSettingsToggleDescriptor] {
32
35
  []
@@ -1,5 +1,5 @@
1
- import RunicCore
2
1
  import Foundation
2
+ import RunicCore
3
3
 
4
4
  enum ProviderImplementationRegistry {
5
5
  private final class Store: @unchecked Sendable {
@@ -1,5 +1,5 @@
1
- import RunicCore
2
1
  import Foundation
2
+ import RunicCore
3
3
  import SwiftUI
4
4
 
5
5
  /// Settings UI context passed to provider implementations.
@@ -1,7 +1,7 @@
1
1
  import AppKit
2
+ import Foundation
2
3
  import RunicCore
3
4
  import RunicMacroSupport
4
- import Foundation
5
5
 
6
6
  @ProviderImplementationRegistration
7
7
  struct TogetherProviderImplementation: ProviderImplementation {
@@ -1,7 +1,7 @@
1
1
  import AppKit
2
+ import Foundation
2
3
  import RunicCore
3
4
  import RunicMacroSupport
4
- import Foundation
5
5
 
6
6
  @ProviderImplementationRegistration
7
7
  struct XAIProviderImplementation: ProviderImplementation {
@@ -1,7 +1,7 @@
1
1
  import AppKit
2
+ import Foundation
2
3
  import RunicCore
3
4
  import RunicMacroSupport
4
- import Foundation
5
5
 
6
6
  @ProviderImplementationRegistration
7
7
  struct ZaiProviderImplementation: ProviderImplementation {
@@ -1,8 +1,8 @@
1
1
  import AppKit
2
- import RunicCore
3
2
  import KeyboardShortcuts
4
3
  import Observation
5
4
  import QuartzCore
5
+ import RunicCore
6
6
  import Security
7
7
  import SwiftUI
8
8
 
@@ -15,6 +15,8 @@ struct RunicApp: App {
15
15
  private let account: AccountInfo
16
16
 
17
17
  init() {
18
+ RunicTypography.registerFonts()
19
+
18
20
  let env = ProcessInfo.processInfo.environment
19
21
  let level = RunicLog.parseLevel(env["RUNIC_LOG_LEVEL"]) ?? .info
20
22
  RunicLog.bootstrapIfNeeded(.init(
@@ -93,7 +95,7 @@ protocol UpdaterProviding: AnyObject {
93
95
  func checkForUpdates(_ sender: Any?)
94
96
  }
95
97
 
96
- // No-op updater used for debug builds and non-bundled runs to suppress Sparkle dialogs.
98
+ /// No-op updater used for debug builds and non-bundled runs to suppress Sparkle dialogs.
97
99
  final class DisabledUpdaterController: UpdaterProviding {
98
100
  var automaticallyChecksForUpdates: Bool = false
99
101
  var automaticallyDownloadsUpdates: Bool = false
@@ -149,7 +151,9 @@ final class SparkleUpdaterController: NSObject, UpdaterProviding, SPUUpdaterDele
149
151
  set { self.controller.updater.automaticallyDownloadsUpdates = newValue }
150
152
  }
151
153
 
152
- var isAvailable: Bool { true }
154
+ var isAvailable: Bool {
155
+ true
156
+ }
153
157
 
154
158
  func checkForUpdates(_ sender: Any?) {
155
159
  self.controller.checkForUpdates(sender)
@@ -300,58 +304,64 @@ final class AppDelegate: NSObject, NSApplicationDelegate {
300
304
  self.refreshLifecycleObservers.append(center.addObserver(
301
305
  forName: NSWorkspace.willSleepNotification,
302
306
  object: nil,
303
- queue: .main) { [weak self] _ in
304
- Task { @MainActor [weak self] in
305
- self?.store?.handleAutoRefreshSystemPause(.systemSleep)
306
- }
307
- })
307
+ queue: .main)
308
+ { [weak self] _ in
309
+ Task { @MainActor [weak self] in
310
+ self?.store?.handleAutoRefreshSystemPause(.systemSleep)
311
+ }
312
+ })
308
313
 
309
314
  self.refreshLifecycleObservers.append(center.addObserver(
310
315
  forName: NSWorkspace.didWakeNotification,
311
316
  object: nil,
312
- queue: .main) { [weak self] _ in
313
- Task { @MainActor [weak self] in
314
- self?.store?.setAutoRefreshSuspended(nil)
315
- await self?.store?.refresh(trigger: .resume)
316
- }
317
- })
317
+ queue: .main)
318
+ { [weak self] _ in
319
+ Task { @MainActor [weak self] in
320
+ self?.store?.setAutoRefreshSuspended(nil)
321
+ await self?.store?.refresh(trigger: .resume)
322
+ }
323
+ })
318
324
 
319
325
  self.refreshLifecycleObservers.append(center.addObserver(
320
326
  forName: NSWorkspace.screensDidSleepNotification,
321
327
  object: nil,
322
- queue: .main) { [weak self] _ in
323
- Task { @MainActor [weak self] in
324
- self?.store?.handleAutoRefreshSystemPause(.screenSleep)
325
- }
326
- })
328
+ queue: .main)
329
+ { [weak self] _ in
330
+ Task { @MainActor [weak self] in
331
+ self?.store?.handleAutoRefreshSystemPause(.screenSleep)
332
+ }
333
+ })
327
334
 
328
335
  self.refreshLifecycleObservers.append(center.addObserver(
329
336
  forName: NSWorkspace.screensDidWakeNotification,
330
337
  object: nil,
331
- queue: .main) { [weak self] _ in
332
- Task { @MainActor [weak self] in
333
- self?.store?.setAutoRefreshSuspended(nil)
334
- await self?.store?.refresh(trigger: .resume)
335
- }
336
- })
338
+ queue: .main)
339
+ { [weak self] _ in
340
+ Task { @MainActor [weak self] in
341
+ self?.store?.setAutoRefreshSuspended(nil)
342
+ await self?.store?.refresh(trigger: .resume)
343
+ }
344
+ })
337
345
 
338
346
  self.refreshLifecycleObservers.append(center.addObserver(
339
347
  forName: NSWorkspace.sessionDidResignActiveNotification,
340
348
  object: nil,
341
- queue: .main) { [weak self] _ in
342
- Task { @MainActor [weak self] in
343
- self?.store?.handleAutoRefreshSystemPause(.sessionInactive)
344
- }
345
- })
349
+ queue: .main)
350
+ { [weak self] _ in
351
+ Task { @MainActor [weak self] in
352
+ self?.store?.handleAutoRefreshSystemPause(.sessionInactive)
353
+ }
354
+ })
346
355
 
347
356
  self.refreshLifecycleObservers.append(center.addObserver(
348
357
  forName: NSWorkspace.sessionDidBecomeActiveNotification,
349
358
  object: nil,
350
- queue: .main) { [weak self] _ in
351
- Task { @MainActor [weak self] in
352
- self?.store?.setAutoRefreshSuspended(nil)
353
- await self?.store?.refresh(trigger: .resume)
354
- }
355
- })
359
+ queue: .main)
360
+ { [weak self] _ in
361
+ Task { @MainActor [weak self] in
362
+ self?.store?.setAutoRefreshSuspended(nil)
363
+ await self?.store?.refresh(trigger: .resume)
364
+ }
365
+ })
356
366
  }
357
367
  }
@@ -1,8 +1,8 @@
1
- import RunicCore
2
1
  import Foundation
2
+ import RunicCore
3
3
  @preconcurrency import UserNotifications
4
4
 
5
- enum SessionQuotaTransition: Equatable, Sendable {
5
+ enum SessionQuotaTransition: Equatable {
6
6
  case none
7
7
  case depleted
8
8
  case restored
@@ -1,5 +1,5 @@
1
- import RunicCore
2
1
  import Foundation
2
+ import RunicCore
3
3
 
4
4
  enum UsagePaceText {
5
5
  private static let minimumExpectedPercent: Double = 3
@@ -12,15 +12,15 @@ import SwiftUI
12
12
  struct UsageProgressBar: View {
13
13
  /// Height variants for different use cases
14
14
  enum Height {
15
- case compact // 6pt - for dense layouts, team member rows
16
- case regular // 8pt - default, used in most menus
17
- case large // 10pt - for prominent displays
15
+ case compact // 6pt - for dense layouts, team member rows
16
+ case regular // 8pt - default, used in most menus
17
+ case large // 10pt - for prominent displays
18
18
 
19
19
  var value: CGFloat {
20
20
  switch self {
21
- case .compact: return 6
22
- case .regular: return 8
23
- case .large: return 10
21
+ case .compact: 6
22
+ case .regular: 8
23
+ case .large: 10
24
24
  }
25
25
  }
26
26
  }
@@ -59,7 +59,8 @@ struct UsageProgressBar: View {
59
59
  GeometryReader { proxy in
60
60
  let width = proxy.size.width
61
61
  let fillWidth = (self.animatedPercent / 100) * width
62
- let trackColor = Color(nsColor: .tertiaryLabelColor).opacity(self.isHighlighted ? RunicColors.Opacity.medium : RunicColors.Opacity.medium)
62
+ let trackColor = Color(nsColor: .tertiaryLabelColor)
63
+ .opacity(self.isHighlighted ? RunicColors.Opacity.medium : RunicColors.Opacity.medium)
63
64
  let tintColor = self.tint
64
65
 
65
66
  ZStack(alignment: .leading) {
@@ -77,7 +78,9 @@ struct UsageProgressBar: View {
77
78
  .fill(
78
79
  LinearGradient(
79
80
  colors: [
80
- Color.white.opacity(self.isHighlighted ? RunicColors.Opacity.subtle : RunicColors.Opacity.light),
81
+ Color.white
82
+ .opacity(self.isHighlighted ? RunicColors.Opacity.subtle : RunicColors
83
+ .Opacity.light),
81
84
  Color.clear,
82
85
  ],
83
86
  startPoint: .top,
@@ -181,7 +184,8 @@ struct UsageProgressBar: View {
181
184
  return HStack(spacing: RunicSpacing.xxxs) {
182
185
  ForEach(0..<count, id: \.self) { _ in
183
186
  RoundedRectangle(cornerRadius: 2, style: .continuous)
184
- .fill(Color.white.opacity(self.isHighlighted ? RunicColors.Opacity.subtle : RunicColors.Opacity.light))
187
+ .fill(Color.white
188
+ .opacity(self.isHighlighted ? RunicColors.Opacity.subtle : RunicColors.Opacity.light))
185
189
  }
186
190
  }
187
191
  .padding(.horizontal, RunicSpacing.xxxs)
@@ -8,7 +8,9 @@ enum LoadingPattern: String, CaseIterable, Identifiable {
8
8
  case pulse
9
9
  case unbraid
10
10
 
11
- var id: String { self.rawValue }
11
+ var id: String {
12
+ self.rawValue
13
+ }
12
14
 
13
15
  var displayName: String {
14
16
  switch self {
@@ -21,7 +23,7 @@ enum LoadingPattern: String, CaseIterable, Identifiable {
21
23
  }
22
24
  }
23
25
 
24
- // Secondary offset so the lower bar moves differently.
26
+ /// Secondary offset so the lower bar moves differently.
25
27
  var secondaryOffset: Double {
26
28
  switch self {
27
29
  case .knightRider: .pi