@sriinnu/runic 2.0.0 → 2.11.2
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.
- package/CHANGELOG.md +261 -0
- package/LICENSE +373 -21
- package/README.md +96 -89
- package/THIRD-PARTY-NOTICES.md +651 -0
- package/package.json +14 -4
- package/.swiftformat +0 -50
- package/.swiftlint.yml +0 -160
- package/CONTRIBUTING.md +0 -456
- package/Icon.icns +0 -0
- package/Icon.icon/Assets/runic.png +0 -0
- package/Icon.icon/icon.json +0 -36
- package/Package.resolved +0 -51
- package/Package.swift +0 -136
- package/Packages/Helix/LICENSE +0 -21
- package/Packages/Helix/Package.swift +0 -29
- package/Packages/Helix/README.md +0 -976
- package/Packages/Helix/Sources/Helix/Binding.swift +0 -111
- package/Packages/Helix/Sources/Helix/CommandParser.swift +0 -160
- package/Packages/Helix/Sources/Helix/CommandSignature.swift +0 -117
- package/Packages/Helix/Sources/Helix/ExpressibleFromArgument.swift +0 -72
- package/Packages/Helix/Sources/Helix/HelpGenerator.swift +0 -175
- package/Packages/Helix/Sources/Helix/NameSpecification.swift +0 -98
- package/Packages/Helix/Sources/Helix/ParsableCommand.swift +0 -204
- package/Packages/Helix/Sources/Helix/Platform/DarwinPlatformContext.swift +0 -44
- package/Packages/Helix/Sources/Helix/Platform/LinuxPlatformContext.swift +0 -34
- package/Packages/Helix/Sources/Helix/Platform/PlatformContext+Default.swift +0 -91
- package/Packages/Helix/Sources/Helix/Platform/PlatformContext.swift +0 -94
- package/Packages/Helix/Sources/Helix/Platform/PlatformPath.swift +0 -167
- package/Packages/Helix/Sources/Helix/Platform/Stdio.swift +0 -99
- package/Packages/Helix/Sources/Helix/Platform/WebPlatformContext.swift +0 -146
- package/Packages/Helix/Sources/Helix/Platform/WindowsPlatformContext.swift +0 -97
- package/Packages/Helix/Sources/Helix/Program.swift +0 -204
- package/Packages/Helix/Sources/Helix/PropertyWrappers.swift +0 -367
- package/Packages/Silo/LICENSE +0 -21
- package/Packages/Silo/Package.swift +0 -34
- package/Packages/Silo/README.md +0 -466
- package/Packages/Silo/Sources/Silo/BinaryCookiesReader.swift +0 -169
- package/Packages/Silo/Sources/Silo/BrowserCookieAnalytics.swift +0 -365
- package/Packages/Silo/Sources/Silo/BrowserCookieBackends.swift +0 -594
- package/Packages/Silo/Sources/Silo/BrowserCookieClient.swift +0 -326
- package/Packages/Silo/Sources/Silo/BrowserCookieExport.swift +0 -154
- package/Packages/Silo/Sources/Silo/BrowserCookieImport.swift +0 -119
- package/Packages/Silo/Sources/Silo/BrowserCookieMockStore.swift +0 -121
- package/Packages/Silo/Sources/Silo/BrowserCookieModels.swift +0 -391
- package/Packages/Silo/Sources/Silo/ChromiumCookieReader.swift +0 -240
- package/Packages/Silo/Sources/Silo/CryptoSupport.swift +0 -86
- package/Packages/Silo/Sources/Silo/FirefoxCookieReader.swift +0 -172
- package/Packages/Silo/Sources/Silo/LinuxChromiumCookieReader.swift +0 -172
- package/Packages/Silo/Sources/Silo/LinuxSecretService.swift +0 -105
- package/Packages/Silo/Sources/Silo/MacOSChromiumCookieReader.swift +0 -191
- package/Packages/Silo/Sources/Silo/SQLiteSnapshot.swift +0 -41
- package/Packages/Silo/Sources/Silo/WindowsChromiumCookieReader.swift +0 -110
- package/RuniciOS/App/RuniciOSApp.swift +0 -105
- package/RuniciOS/Core/RunicTypographyiOS.swift +0 -24
- package/RuniciOS/Core/iOSUsageStore.swift +0 -192
- package/RuniciOS/Views/ProviderDetailView.swift +0 -312
- package/RuniciOS/Views/ProviderListView.swift +0 -228
- package/RuniciOS/Widgets/LargeWidget.swift +0 -367
- package/RuniciOS/Widgets/LiveActivity.swift +0 -342
- package/RuniciOS/Widgets/LockScreenWidget.swift +0 -273
- package/RuniciOS/Widgets/MediumWidget.swift +0 -370
- package/RuniciOS/Widgets/RunicWidget.swift +0 -274
- package/RuniciOS/Widgets/SmallWidget.swift +0 -281
- package/RuniciOS/Widgets/WidgetModels.swift +0 -285
- package/RuniciOS/Widgets/WidgetTimeline.swift +0 -270
- package/Scripts/CREATION-SUMMARY.md +0 -367
- package/Scripts/DIRECTORY-STRUCTURE.md +0 -358
- package/Scripts/GETTING-STARTED-CHECKLIST.md +0 -364
- package/Scripts/INDEX.md +0 -365
- package/Scripts/QUICK-REFERENCE.md +0 -164
- package/Scripts/README-SCRIPTS.md +0 -926
- package/Scripts/build-android.sh +0 -526
- package/Scripts/build-ios.sh +0 -529
- package/Scripts/build-macos.sh +0 -603
- package/Scripts/build-windows.sh +0 -504
- package/Scripts/build_icon.sh +0 -49
- package/Scripts/changelog-to-html.sh +0 -89
- package/Scripts/check-release-assets.sh +0 -10
- package/Scripts/ci-config.yml +0 -474
- package/Scripts/compile_and_run.sh +0 -219
- package/Scripts/compile_and_run_adhoc.sh +0 -4
- package/Scripts/docs-list.mjs +0 -119
- package/Scripts/make_appcast.sh +0 -58
- package/Scripts/package_app.sh +0 -409
- package/Scripts/release-lib.sh +0 -214
- package/Scripts/release.sh +0 -76
- package/Scripts/setup-all.sh +0 -387
- package/Scripts/setup-ios.sh +0 -404
- package/Scripts/setup-react-native.sh +0 -523
- package/Scripts/sign-and-notarize.sh +0 -122
- package/Scripts/test_live_update.sh +0 -38
- package/Scripts/validate_changelog.sh +0 -23
- package/Scripts/verify_appcast.sh +0 -92
- package/Sources/Runic/About.swift +0 -93
- package/Sources/Runic/AppNotifications.swift +0 -117
- package/Sources/Runic/Controllers/StatusItemController+Actions.swift +0 -670
- package/Sources/Runic/Controllers/StatusItemController+Animation.swift +0 -519
- package/Sources/Runic/Controllers/StatusItemController+ChartSubmenus.swift +0 -824
- package/Sources/Runic/Controllers/StatusItemController+CustomProviders.swift +0 -90
- package/Sources/Runic/Controllers/StatusItemController+Menu.swift +0 -1412
- package/Sources/Runic/Controllers/StatusItemController+MenuCards.swift +0 -339
- package/Sources/Runic/Controllers/StatusItemController+MenuHelpers.swift +0 -423
- package/Sources/Runic/Controllers/StatusItemController.swift +0 -360
- package/Sources/Runic/Core/BudgetNotificationManager.swift +0 -81
- package/Sources/Runic/Core/Login/ClaudeLoginRunner.swift +0 -103
- package/Sources/Runic/Core/Login/CodexLoginRunner.swift +0 -154
- package/Sources/Runic/Core/Login/CursorLoginRunner.swift +0 -206
- package/Sources/Runic/Core/Login/GeminiLoginRunner.swift +0 -92
- package/Sources/Runic/Core/Rendering/IconRenderer.swift +0 -1222
- package/Sources/Runic/Core/Rendering/IconView.swift +0 -122
- package/Sources/Runic/Core/Rendering/ProviderBrandIcon.swift +0 -71
- package/Sources/Runic/Core/RunicAnimation.swift +0 -53
- package/Sources/Runic/Core/RunicColors.swift +0 -73
- package/Sources/Runic/Core/RunicCornerRadius.swift +0 -15
- package/Sources/Runic/Core/RunicSpacing.swift +0 -68
- package/Sources/Runic/Core/RunicTypography.swift +0 -206
- package/Sources/Runic/Core/Stores/AuggieTokenStore.swift +0 -117
- package/Sources/Runic/Core/Stores/AzureOpenAITokenStore.swift +0 -117
- package/Sources/Runic/Core/Stores/CerebrasTokenStore.swift +0 -117
- package/Sources/Runic/Core/Stores/CohereTokenStore.swift +0 -117
- package/Sources/Runic/Core/Stores/CopilotTokenStore.swift +0 -117
- package/Sources/Runic/Core/Stores/CustomProviderStore.swift +0 -158
- package/Sources/Runic/Core/Stores/DeepSeekTokenStore.swift +0 -117
- package/Sources/Runic/Core/Stores/FireworksTokenStore.swift +0 -117
- package/Sources/Runic/Core/Stores/GroqTokenStore.swift +0 -117
- package/Sources/Runic/Core/Stores/KimiTokenStore.swift +0 -117
- package/Sources/Runic/Core/Stores/MiniMaxCookieHeaderStore.swift +0 -117
- package/Sources/Runic/Core/Stores/MiniMaxGroupIDStore.swift +0 -117
- package/Sources/Runic/Core/Stores/MiniMaxTokenStore.swift +0 -117
- package/Sources/Runic/Core/Stores/MistralTokenStore.swift +0 -117
- package/Sources/Runic/Core/Stores/OpenRouterTokenStore.swift +0 -117
- package/Sources/Runic/Core/Stores/PerplexityTokenStore.swift +0 -117
- package/Sources/Runic/Core/Stores/ProviderToggleStore.swift +0 -30
- package/Sources/Runic/Core/Stores/QwenTokenStore.swift +0 -117
- package/Sources/Runic/Core/Stores/SambaNovaTokenStore.swift +0 -117
- package/Sources/Runic/Core/Stores/SettingsStore.swift +0 -1749
- package/Sources/Runic/Core/Stores/TogetherTokenStore.swift +0 -117
- package/Sources/Runic/Core/Stores/UsageStore+Accessors.swift +0 -33
- package/Sources/Runic/Core/Stores/UsageStore+Status.swift +0 -189
- package/Sources/Runic/Core/Stores/UsageStore+TokenCost.swift +0 -33
- package/Sources/Runic/Core/Stores/UsageStore+WidgetSnapshot.swift +0 -67
- package/Sources/Runic/Core/Stores/UsageStore.swift +0 -3631
- package/Sources/Runic/Core/Stores/XAITokenStore.swift +0 -117
- package/Sources/Runic/Core/Stores/ZaiTokenStore.swift +0 -117
- package/Sources/Runic/Core/UsageExporter.swift +0 -197
- package/Sources/Runic/Date+RelativeDescription.swift +0 -21
- package/Sources/Runic/HiddenWindowView.swift +0 -32
- package/Sources/Runic/InstallOrigin.swift +0 -9
- package/Sources/Runic/KeyboardShortcuts+Names.swift +0 -6
- package/Sources/Runic/MouseLocationReader.swift +0 -65
- package/Sources/Runic/Notifications+Runic.swift +0 -6
- package/Sources/Runic/OpenAICreditsPurchaseWindowController.swift +0 -503
- package/Sources/Runic/ProviderRegistry.swift +0 -100
- package/Sources/Runic/ProviderSwitcherButtons.swift +0 -267
- package/Sources/Runic/Providers/Antigravity/AntigravityLoginFlow.swift +0 -11
- package/Sources/Runic/Providers/Antigravity/AntigravityProviderImplementation.swift +0 -14
- package/Sources/Runic/Providers/Auggie/AuggieProviderImplementation.swift +0 -24
- package/Sources/Runic/Providers/Azure/AzureProviderImplementation.swift +0 -52
- package/Sources/Runic/Providers/Bedrock/BedrockProviderImplementation.swift +0 -42
- package/Sources/Runic/Providers/Cerebras/CerebrasProviderImplementation.swift +0 -24
- package/Sources/Runic/Providers/Claude/ClaudeLoginFlow.swift +0 -26
- package/Sources/Runic/Providers/Claude/ClaudeProviderImplementation.swift +0 -14
- package/Sources/Runic/Providers/Codex/CodexLoginFlow.swift +0 -18
- package/Sources/Runic/Providers/Codex/CodexProviderImplementation.swift +0 -15
- package/Sources/Runic/Providers/Cohere/CohereProviderImplementation.swift +0 -24
- package/Sources/Runic/Providers/Copilot/CopilotLoginFlow.swift +0 -193
- package/Sources/Runic/Providers/Copilot/CopilotProviderImplementation.swift +0 -110
- package/Sources/Runic/Providers/Cursor/CursorLoginFlow.swift +0 -28
- package/Sources/Runic/Providers/Cursor/CursorProviderImplementation.swift +0 -15
- package/Sources/Runic/Providers/DeepSeek/DeepSeekProviderImplementation.swift +0 -24
- package/Sources/Runic/Providers/Factory/FactoryLoginFlow.swift +0 -12
- package/Sources/Runic/Providers/Factory/FactoryProviderImplementation.swift +0 -15
- package/Sources/Runic/Providers/Fireworks/FireworksProviderImplementation.swift +0 -24
- package/Sources/Runic/Providers/Gemini/GeminiLoginFlow.swift +0 -20
- package/Sources/Runic/Providers/Gemini/GeminiProviderImplementation.swift +0 -15
- package/Sources/Runic/Providers/Groq/GroqProviderImplementation.swift +0 -24
- package/Sources/Runic/Providers/Kimi/KimiProviderImplementation.swift +0 -24
- package/Sources/Runic/Providers/MiniMax/MiniMaxProviderImplementation.swift +0 -32
- package/Sources/Runic/Providers/Mistral/MistralProviderImplementation.swift +0 -24
- package/Sources/Runic/Providers/OpenRouter/OpenRouterProviderImplementation.swift +0 -24
- package/Sources/Runic/Providers/Perplexity/PerplexityProviderImplementation.swift +0 -24
- package/Sources/Runic/Providers/SambaNova/SambaNovaProviderImplementation.swift +0 -24
- package/Sources/Runic/Providers/Shared/ProviderCatalog.swift +0 -15
- package/Sources/Runic/Providers/Shared/ProviderImplementation.swift +0 -51
- package/Sources/Runic/Providers/Shared/ProviderImplementationRegistry.swift +0 -66
- package/Sources/Runic/Providers/Shared/ProviderLoginFlow.swift +0 -12
- package/Sources/Runic/Providers/Shared/ProviderSettingsDescriptors.swift +0 -99
- package/Sources/Runic/Providers/Shared/SystemSettingsLinks.swift +0 -18
- package/Sources/Runic/Providers/Together/TogetherProviderImplementation.swift +0 -24
- package/Sources/Runic/Providers/XAI/XAIProviderImplementation.swift +0 -24
- package/Sources/Runic/Providers/Zai/ZaiProviderImplementation.swift +0 -24
- package/Sources/Runic/Resources/Fonts/Caveat-Bold.ttf +0 -0
- package/Sources/Runic/Resources/Fonts/Caveat-Regular.ttf +0 -0
- package/Sources/Runic/Resources/Fonts/FiraCode-Bold.ttf +0 -0
- package/Sources/Runic/Resources/Fonts/FiraCode-Light.ttf +0 -0
- package/Sources/Runic/Resources/Fonts/FiraCode-Medium.ttf +0 -0
- package/Sources/Runic/Resources/Fonts/FiraCode-Regular.ttf +0 -0
- package/Sources/Runic/Resources/Fonts/FiraCode-SemiBold.ttf +0 -0
- package/Sources/Runic/Resources/Fonts/IBMPlexMono-Bold.ttf +0 -0
- package/Sources/Runic/Resources/Fonts/IBMPlexMono-Medium.ttf +0 -0
- package/Sources/Runic/Resources/Fonts/IBMPlexMono-Regular.ttf +0 -0
- package/Sources/Runic/Resources/Fonts/IBMPlexMono-SemiBold.ttf +0 -0
- package/Sources/Runic/Resources/Fonts/Inconsolata-Bold.ttf +0 -0
- package/Sources/Runic/Resources/Fonts/Inconsolata-Medium.ttf +0 -0
- package/Sources/Runic/Resources/Fonts/Inconsolata-Regular.ttf +0 -0
- package/Sources/Runic/Resources/Fonts/Inconsolata-SemiBold.ttf +0 -0
- package/Sources/Runic/Resources/Fonts/JetBrainsMono-Bold.ttf +0 -0
- package/Sources/Runic/Resources/Fonts/JetBrainsMono-Medium.ttf +0 -0
- package/Sources/Runic/Resources/Fonts/JetBrainsMono-Regular.ttf +0 -0
- package/Sources/Runic/Resources/Fonts/JetBrainsMono-SemiBold.ttf +0 -0
- package/Sources/Runic/Resources/Fonts/SpaceMono-Bold.ttf +0 -0
- package/Sources/Runic/Resources/Fonts/SpaceMono-Regular.ttf +0 -0
- package/Sources/Runic/Resources/ProviderIcon-antigravity.svg +0 -2
- package/Sources/Runic/Resources/ProviderIcon-auggie.svg +0 -3
- package/Sources/Runic/Resources/ProviderIcon-azure.svg +0 -5
- package/Sources/Runic/Resources/ProviderIcon-bedrock.svg +0 -7
- package/Sources/Runic/Resources/ProviderIcon-cerebras.svg +0 -3
- package/Sources/Runic/Resources/ProviderIcon-claude.svg +0 -1
- package/Sources/Runic/Resources/ProviderIcon-codex.svg +0 -1
- package/Sources/Runic/Resources/ProviderIcon-cohere.svg +0 -3
- package/Sources/Runic/Resources/ProviderIcon-copilot.svg +0 -1
- package/Sources/Runic/Resources/ProviderIcon-cursor.svg +0 -3
- package/Sources/Runic/Resources/ProviderIcon-deepseek.svg +0 -4
- package/Sources/Runic/Resources/ProviderIcon-factory.svg +0 -3
- package/Sources/Runic/Resources/ProviderIcon-fireworks.svg +0 -3
- package/Sources/Runic/Resources/ProviderIcon-gemini.svg +0 -1
- package/Sources/Runic/Resources/ProviderIcon-groq.svg +0 -1
- package/Sources/Runic/Resources/ProviderIcon-kimi.svg +0 -4
- package/Sources/Runic/Resources/ProviderIcon-minimax.svg +0 -1
- package/Sources/Runic/Resources/ProviderIcon-mistral.svg +0 -5
- package/Sources/Runic/Resources/ProviderIcon-openrouter.svg +0 -7
- package/Sources/Runic/Resources/ProviderIcon-perplexity.svg +0 -4
- package/Sources/Runic/Resources/ProviderIcon-qwen.svg +0 -9
- package/Sources/Runic/Resources/ProviderIcon-sambanova.svg +0 -4
- package/Sources/Runic/Resources/ProviderIcon-together.svg +0 -5
- package/Sources/Runic/Resources/ProviderIcon-vertexai.svg +0 -17
- package/Sources/Runic/Resources/ProviderIcon-xai.svg +0 -3
- package/Sources/Runic/Resources/ProviderIcon-zai.svg +0 -5
- package/Sources/Runic/Resources/RunicMenubarIcon.svg +0 -7
- package/Sources/Runic/Resources/provider-context-windows.json +0 -20
- package/Sources/Runic/RunicApp.swift +0 -367
- package/Sources/Runic/SessionQuotaNotifications.swift +0 -58
- package/Sources/Runic/UsagePaceText.swift +0 -52
- package/Sources/Runic/UsageProgressBar.swift +0 -228
- package/Sources/Runic/Utilities/DisplayLink.swift +0 -96
- package/Sources/Runic/Utilities/LoadingPattern.swift +0 -62
- package/Sources/Runic/Utilities/PerformanceConstants.swift +0 -85
- package/Sources/Runic/Views/Menu/AlertsMenuView.swift +0 -254
- package/Sources/Runic/Views/Menu/ChartPanelStyle.swift +0 -22
- package/Sources/Runic/Views/Menu/CostComparativeChartMenuView.swift +0 -275
- package/Sources/Runic/Views/Menu/CostHistoryChartMenuView.swift +0 -377
- package/Sources/Runic/Views/Menu/CreditsHistoryChartMenuView.swift +0 -312
- package/Sources/Runic/Views/Menu/EfficiencyMetricsMenuView.swift +0 -311
- package/Sources/Runic/Views/Menu/HeroStatCardsMenuView.swift +0 -231
- package/Sources/Runic/Views/Menu/HourlyActivityChartMenuView.swift +0 -228
- package/Sources/Runic/Views/Menu/InlineUsageChartView.swift +0 -157
- package/Sources/Runic/Views/Menu/MenuCardEntranceModifier.swift +0 -63
- package/Sources/Runic/Views/Menu/MenuCardSidebarView.swift +0 -248
- package/Sources/Runic/Views/Menu/MenuCardSkeletonView.swift +0 -104
- package/Sources/Runic/Views/Menu/MenuCardView.swift +0 -1889
- package/Sources/Runic/Views/Menu/MenuContent.swift +0 -153
- package/Sources/Runic/Views/Menu/MenuDescriptor.swift +0 -371
- package/Sources/Runic/Views/Menu/MenuHighlightStyle.swift +0 -35
- package/Sources/Runic/Views/Menu/ModelBreakdownMenuView.swift +0 -241
- package/Sources/Runic/Views/Menu/OverviewMenuView.swift +0 -281
- package/Sources/Runic/Views/Menu/ProjectBreakdownMenuView.swift +0 -214
- package/Sources/Runic/Views/Menu/ProjectBudgetMenuView.swift +0 -220
- package/Sources/Runic/Views/Menu/ProviderTabBarView.swift +0 -86
- package/Sources/Runic/Views/Menu/SubscriptionUtilizationChartMenuView.swift +0 -214
- package/Sources/Runic/Views/Menu/UsageBreakdownChartMenuView.swift +0 -398
- package/Sources/Runic/Views/Menu/UsageHeatmapMenuView.swift +0 -231
- package/Sources/Runic/Views/Menu/UsageTimelineChartMenuView.swift +0 -369
- package/Sources/Runic/Views/Menu/UsageWindowComparisonChartMenuView.swift +0 -191
- package/Sources/Runic/Views/Menu/WeeklyActivityChartMenuView.swift +0 -132
- package/Sources/Runic/Views/Performance/PerformanceDashboardView.swift +0 -621
- package/Sources/Runic/Views/Preferences/LiquidComponents.swift +0 -306
- package/Sources/Runic/Views/Preferences/PreferencesAboutPane.swift +0 -271
- package/Sources/Runic/Views/Preferences/PreferencesAdvancedPane.swift +0 -268
- package/Sources/Runic/Views/Preferences/PreferencesAlertsPane.swift +0 -418
- package/Sources/Runic/Views/Preferences/PreferencesAnalyticsPane.swift +0 -637
- package/Sources/Runic/Views/Preferences/PreferencesBudgetsPane.swift +0 -344
- package/Sources/Runic/Views/Preferences/PreferencesComponents.swift +0 -230
- package/Sources/Runic/Views/Preferences/PreferencesCustomProvidersPane.swift +0 -321
- package/Sources/Runic/Views/Preferences/PreferencesDebugPane.swift +0 -469
- package/Sources/Runic/Views/Preferences/PreferencesGeneralPane.swift +0 -250
- package/Sources/Runic/Views/Preferences/PreferencesHelpPane.swift +0 -50
- package/Sources/Runic/Views/Preferences/PreferencesIntegrationsPane.swift +0 -572
- package/Sources/Runic/Views/Preferences/PreferencesPerformancePane.swift +0 -291
- package/Sources/Runic/Views/Preferences/PreferencesProvidersPane.swift +0 -3480
- package/Sources/Runic/Views/Preferences/PreferencesSelection.swift +0 -29
- package/Sources/Runic/Views/Preferences/PreferencesSyncPane.swift +0 -61
- package/Sources/Runic/Views/Preferences/PreferencesView.swift +0 -213
- package/Sources/Runic/Views/Rating/QualityRatingView.swift +0 -238
- package/Sources/Runic/Views/Team/TeamDashboardView.swift +0 -376
- package/Sources/Runic/Views/Team/TeamInviteSheet.swift +0 -175
- package/Sources/Runic/Views/Team/TeamManagementView.swift +0 -762
- package/Sources/Runic/Views/Team/TeamMemberRow.swift +0 -181
- package/Sources/RunicCLI/CLIEntry.swift +0 -983
- package/Sources/RunicCLI/CLIRenderer.swift +0 -87
- package/Sources/RunicCLI/Commands/EnhancedUsageCommand.swift +0 -588
- package/Sources/RunicCLI/Commands/ModelsCommand.swift +0 -363
- package/Sources/RunicCLI/Commands/ProjectsCommand.swift +0 -453
- package/Sources/RunicCLI/Commands/ResetCommand.swift +0 -430
- package/Sources/RunicCLI/Commands/UsageLedgerSourceFactory.swift +0 -167
- package/Sources/RunicClaudeWatchdog/main.swift +0 -122
- package/Sources/RunicClaudeWebProbe/main.swift +0 -62
- package/Sources/RunicCore/AlertRuleStore.swift +0 -187
- package/Sources/RunicCore/BrowserCookieImportOrder.swift +0 -25
- package/Sources/RunicCore/CopilotUsageModels.swift +0 -84
- package/Sources/RunicCore/CostUsageFetcher.swift +0 -119
- package/Sources/RunicCore/CostUsageModels.swift +0 -479
- package/Sources/RunicCore/CreditsModels.swift +0 -50
- package/Sources/RunicCore/CustomProviders/CustomProviderModels.swift +0 -268
- package/Sources/RunicCore/CustomProviders/GenericProviderFetcher.swift +0 -631
- package/Sources/RunicCore/CustomProviders/ProviderTemplates.swift +0 -444
- package/Sources/RunicCore/Host/PTY/TTYCommandRunner.swift +0 -679
- package/Sources/RunicCore/Host/Process/SubprocessRunner.swift +0 -135
- package/Sources/RunicCore/Integrations/GitHubIntegration.swift +0 -173
- package/Sources/RunicCore/Logging/JSONStderrLogHandler.swift +0 -79
- package/Sources/RunicCore/Logging/OSLogLogHandler.swift +0 -86
- package/Sources/RunicCore/Logging/RunicLog.swift +0 -123
- package/Sources/RunicCore/Models/EnhancedUsageModels.swift +0 -370
- package/Sources/RunicCore/OpenAIDashboardModels.swift +0 -210
- package/Sources/RunicCore/OpenAIWeb/OpenAIDashboardBrowserCookieImporter.swift +0 -676
- package/Sources/RunicCore/OpenAIWeb/OpenAIDashboardFetcher.swift +0 -492
- package/Sources/RunicCore/OpenAIWeb/OpenAIDashboardNavigationDelegate.swift +0 -51
- package/Sources/RunicCore/OpenAIWeb/OpenAIDashboardParser.swift +0 -483
- package/Sources/RunicCore/OpenAIWeb/OpenAIDashboardScrapeScript.swift +0 -558
- package/Sources/RunicCore/OpenAIWeb/OpenAIDashboardWebViewCache.swift +0 -204
- package/Sources/RunicCore/OpenAIWeb/OpenAIDashboardWebsiteDataStore.swift +0 -78
- package/Sources/RunicCore/PathEnvironment.swift +0 -482
- package/Sources/RunicCore/Performance/PerformanceModels.swift +0 -371
- package/Sources/RunicCore/Performance/PerformanceStorageImpl.swift +0 -426
- package/Sources/RunicCore/Policy/UsagePolicyEngine.swift +0 -178
- package/Sources/RunicCore/ProjectBudgetStore.swift +0 -102
- package/Sources/RunicCore/ProviderCostSnapshot.swift +0 -29
- package/Sources/RunicCore/Providers/Antigravity/AntigravityProviderDescriptor.swift +0 -68
- package/Sources/RunicCore/Providers/Antigravity/AntigravityStatusProbe.swift +0 -685
- package/Sources/RunicCore/Providers/Auggie/AuggieProviderDescriptor.swift +0 -83
- package/Sources/RunicCore/Providers/Auggie/AuggieUsageFetcher.swift +0 -142
- package/Sources/RunicCore/Providers/Azure/AzureProviderDescriptor.swift +0 -141
- package/Sources/RunicCore/Providers/Azure/AzureUsageFetcher.swift +0 -188
- package/Sources/RunicCore/Providers/Bedrock/BedrockProviderDescriptor.swift +0 -126
- package/Sources/RunicCore/Providers/Bedrock/BedrockUsageFetcher.swift +0 -164
- package/Sources/RunicCore/Providers/Cerebras/CerebrasProviderDescriptor.swift +0 -84
- package/Sources/RunicCore/Providers/Cerebras/CerebrasUsageFetcher.swift +0 -75
- package/Sources/RunicCore/Providers/Claude/ClaudeCLISession.swift +0 -332
- package/Sources/RunicCore/Providers/Claude/ClaudeOAuth/ClaudeOAuthCredentials.swift +0 -180
- package/Sources/RunicCore/Providers/Claude/ClaudeOAuth/ClaudeOAuthUsageFetcher.swift +0 -137
- package/Sources/RunicCore/Providers/Claude/ClaudeProviderDescriptor.swift +0 -209
- package/Sources/RunicCore/Providers/Claude/ClaudeStatusProbe.swift +0 -654
- package/Sources/RunicCore/Providers/Claude/ClaudeUsageDataSource.swift +0 -30
- package/Sources/RunicCore/Providers/Claude/ClaudeUsageFetcher.swift +0 -480
- package/Sources/RunicCore/Providers/Claude/ClaudeWeb/ClaudeWebAPIFetcher.swift +0 -780
- package/Sources/RunicCore/Providers/Codex/CodexOAuth/CodexOAuthCredentials.swift +0 -147
- package/Sources/RunicCore/Providers/Codex/CodexOAuth/CodexOAuthUsageFetcher.swift +0 -280
- package/Sources/RunicCore/Providers/Codex/CodexOAuth/CodexTokenRefresher.swift +0 -100
- package/Sources/RunicCore/Providers/Codex/CodexProviderDescriptor.swift +0 -245
- package/Sources/RunicCore/Providers/Codex/CodexStatusProbe.swift +0 -125
- package/Sources/RunicCore/Providers/Codex/CodexUsageDataSource.swift +0 -26
- package/Sources/RunicCore/Providers/Codex/CodexWebDashboardStrategy.swift +0 -183
- package/Sources/RunicCore/Providers/Cohere/CohereProviderDescriptor.swift +0 -83
- package/Sources/RunicCore/Providers/Cohere/CohereUsageFetcher.swift +0 -85
- package/Sources/RunicCore/Providers/Copilot/CopilotDeviceFlow.swift +0 -123
- package/Sources/RunicCore/Providers/Copilot/CopilotGitHubCLITokenReader.swift +0 -117
- package/Sources/RunicCore/Providers/Copilot/CopilotProviderDescriptor.swift +0 -100
- package/Sources/RunicCore/Providers/Copilot/CopilotUsageFetcher.swift +0 -293
- package/Sources/RunicCore/Providers/Copilot/CopilotVSCodeTokenReader.swift +0 -385
- package/Sources/RunicCore/Providers/Cursor/CursorProviderDescriptor.swift +0 -67
- package/Sources/RunicCore/Providers/Cursor/CursorStatusProbe.swift +0 -595
- package/Sources/RunicCore/Providers/DeepSeek/DeepSeekProviderDescriptor.swift +0 -85
- package/Sources/RunicCore/Providers/DeepSeek/DeepSeekUsageFetcher.swift +0 -108
- package/Sources/RunicCore/Providers/Factory/FactoryLocalStorageImporter.swift +0 -398
- package/Sources/RunicCore/Providers/Factory/FactoryProviderDescriptor.swift +0 -67
- package/Sources/RunicCore/Providers/Factory/FactoryStatusProbe.swift +0 -1276
- package/Sources/RunicCore/Providers/Fireworks/FireworksProviderDescriptor.swift +0 -84
- package/Sources/RunicCore/Providers/Fireworks/FireworksUsageFetcher.swift +0 -75
- package/Sources/RunicCore/Providers/Gemini/GeminiProviderDescriptor.swift +0 -67
- package/Sources/RunicCore/Providers/Gemini/GeminiStatusProbe.swift +0 -839
- package/Sources/RunicCore/Providers/Groq/GroqProviderDescriptor.swift +0 -83
- package/Sources/RunicCore/Providers/Groq/GroqUsageFetcher.swift +0 -71
- package/Sources/RunicCore/Providers/Kimi/KimiProviderDescriptor.swift +0 -83
- package/Sources/RunicCore/Providers/Kimi/KimiUsageFetcher.swift +0 -77
- package/Sources/RunicCore/Providers/MiniMax/MiniMaxProviderDescriptor.swift +0 -97
- package/Sources/RunicCore/Providers/MiniMax/MiniMaxSettingsReader.swift +0 -54
- package/Sources/RunicCore/Providers/MiniMax/MiniMaxUsageFetcher.swift +0 -168
- package/Sources/RunicCore/Providers/MiniMax/MiniMaxWebUsageFetcher.swift +0 -911
- package/Sources/RunicCore/Providers/Mistral/MistralProviderDescriptor.swift +0 -84
- package/Sources/RunicCore/Providers/Mistral/MistralUsageFetcher.swift +0 -75
- package/Sources/RunicCore/Providers/OpenRouter/OpenRouterProviderDescriptor.swift +0 -87
- package/Sources/RunicCore/Providers/OpenRouter/OpenRouterUsageFetcher.swift +0 -216
- package/Sources/RunicCore/Providers/Perplexity/PerplexityProviderDescriptor.swift +0 -84
- package/Sources/RunicCore/Providers/Perplexity/PerplexityUsageFetcher.swift +0 -75
- package/Sources/RunicCore/Providers/ProviderBranding.swift +0 -25
- package/Sources/RunicCore/Providers/ProviderCLIConfig.swift +0 -17
- package/Sources/RunicCore/Providers/ProviderDescriptor.swift +0 -129
- package/Sources/RunicCore/Providers/ProviderFetchPlan.swift +0 -263
- package/Sources/RunicCore/Providers/ProviderSettingsSnapshot.swift +0 -98
- package/Sources/RunicCore/Providers/ProviderTokenResolver.swift +0 -501
- package/Sources/RunicCore/Providers/ProviderVersionDetector.swift +0 -68
- package/Sources/RunicCore/Providers/Providers.swift +0 -184
- package/Sources/RunicCore/Providers/Qwen/QwenProviderDescriptor.swift +0 -86
- package/Sources/RunicCore/Providers/Qwen/QwenSettingsReader.swift +0 -30
- package/Sources/RunicCore/Providers/Qwen/QwenUsageStats.swift +0 -328
- package/Sources/RunicCore/Providers/SambaNova/SambaNovaProviderDescriptor.swift +0 -84
- package/Sources/RunicCore/Providers/SambaNova/SambaNovaUsageFetcher.swift +0 -75
- package/Sources/RunicCore/Providers/Together/TogetherProviderDescriptor.swift +0 -83
- package/Sources/RunicCore/Providers/Together/TogetherUsageFetcher.swift +0 -75
- package/Sources/RunicCore/Providers/VertexAI/VertexAIProviderDescriptor.swift +0 -123
- package/Sources/RunicCore/Providers/VertexAI/VertexAISettingsReader.swift +0 -48
- package/Sources/RunicCore/Providers/VertexAI/VertexAIUsageFetcher.swift +0 -144
- package/Sources/RunicCore/Providers/XAI/XAIProviderDescriptor.swift +0 -83
- package/Sources/RunicCore/Providers/XAI/XAIUsageFetcher.swift +0 -75
- package/Sources/RunicCore/Providers/Zai/ZaiProviderDescriptor.swift +0 -74
- package/Sources/RunicCore/Providers/Zai/ZaiSettingsReader.swift +0 -41
- package/Sources/RunicCore/Providers/Zai/ZaiUsageStats.swift +0 -745
- package/Sources/RunicCore/Sync/BackgroundSyncManager.swift +0 -384
- package/Sources/RunicCore/Sync/SyncConflictResolver.swift +0 -307
- package/Sources/RunicCore/Sync/SyncProtocol.swift +0 -287
- package/Sources/RunicCore/Sync/SyncRecord.swift +0 -402
- package/Sources/RunicCore/Sync/SyncUsageExample.swift +0 -288
- package/Sources/RunicCore/Sync/TeamSyncRecords.swift +0 -768
- package/Sources/RunicCore/Sync/iCloudSyncEngine.swift +0 -338
- package/Sources/RunicCore/Team/TeamModels.swift +0 -584
- package/Sources/RunicCore/Team/TeamShowbackExporter.swift +0 -495
- package/Sources/RunicCore/Team/TeamStore.swift +0 -809
- package/Sources/RunicCore/TextParsing.swift +0 -55
- package/Sources/RunicCore/UsageFetcher.swift +0 -694
- package/Sources/RunicCore/UsageFormatter.swift +0 -410
- package/Sources/RunicCore/UsageLedger/ClaudeUsageLogSource.swift +0 -441
- package/Sources/RunicCore/UsageLedger/CodexUsageLogSource.swift +0 -502
- package/Sources/RunicCore/UsageLedger/LedgerCache.swift +0 -161
- package/Sources/RunicCore/UsageLedger/OTelGenAILedgerAdapter.swift +0 -550
- package/Sources/RunicCore/UsageLedger/UsageLedger.swift +0 -29
- package/Sources/RunicCore/UsageLedger/UsageLedgerAggregator.swift +0 -675
- package/Sources/RunicCore/UsageLedger/UsageLedgerInsightsAdvisor.swift +0 -209
- package/Sources/RunicCore/UsageLedger/UsageLedgerModels.swift +0 -417
- package/Sources/RunicCore/UsageLedger/UsageLedgerProjectIdentity.swift +0 -284
- package/Sources/RunicCore/UsagePace.swift +0 -81
- package/Sources/RunicCore/Vendored/CostUsage/CostUsageCache.swift +0 -73
- package/Sources/RunicCore/Vendored/CostUsage/CostUsageJsonl.swift +0 -74
- package/Sources/RunicCore/Vendored/CostUsage/CostUsagePricing.swift +0 -208
- package/Sources/RunicCore/Vendored/CostUsage/CostUsageScanner+Claude.swift +0 -455
- package/Sources/RunicCore/Vendored/CostUsage/CostUsageScanner+Timestamp.swift +0 -132
- package/Sources/RunicCore/Vendored/CostUsage/CostUsageScanner.swift +0 -589
- package/Sources/RunicCore/WidgetSnapshot.swift +0 -183
- package/Sources/RunicMacroSupport/ProviderRegistrationMacros.swift +0 -14
- package/Sources/RunicMacros/ProviderRegistrationMacros.swift +0 -216
- package/Sources/RunicWidget/RunicWidgetBundle.swift +0 -79
- package/Sources/RunicWidget/RunicWidgetProvider.swift +0 -283
- package/Sources/RunicWidget/RunicWidgetViews.swift +0 -680
- package/Tests/RunicTests/AntigravityStatusProbeTests.swift +0 -50
- package/Tests/RunicTests/AppDelegateTests.swift +0 -48
- package/Tests/RunicTests/BrowserCookieOrderLabelTests.swift +0 -21
- package/Tests/RunicTests/CLIArgumentParsingTests.swift +0 -69
- package/Tests/RunicTests/CLICostTests.swift +0 -64
- package/Tests/RunicTests/CLIProviderSelectionTests.swift +0 -21
- package/Tests/RunicTests/CLISnapshotTests.swift +0 -71
- package/Tests/RunicTests/CLIWebFallbackTests.swift +0 -57
- package/Tests/RunicTests/ClaudeOAuthTests.swift +0 -163
- package/Tests/RunicTests/ClaudeResilienceTests.swift +0 -29
- package/Tests/RunicTests/ClaudeUsageTests.swift +0 -369
- package/Tests/RunicTests/CodexOAuthTests.swift +0 -121
- package/Tests/RunicTests/CodexUsageLogSourceTests.swift +0 -80
- package/Tests/RunicTests/CopilotTokenResolverTests.swift +0 -74
- package/Tests/RunicTests/CopilotVSCodeTokenReaderTests.swift +0 -74
- package/Tests/RunicTests/CostUsageDecodingTests.swift +0 -392
- package/Tests/RunicTests/CostUsagePricingTests.swift +0 -48
- package/Tests/RunicTests/CostUsageScannerTests.swift +0 -698
- package/Tests/RunicTests/CursorStatusProbeTests.swift +0 -322
- package/Tests/RunicTests/FactoryStatusProbeTests.swift +0 -67
- package/Tests/RunicTests/GeminiAPITestHelpers.swift +0 -94
- package/Tests/RunicTests/GeminiLoginAlertTests.swift +0 -27
- package/Tests/RunicTests/GeminiStatusProbeAPITests.swift +0 -283
- package/Tests/RunicTests/GeminiStatusProbePlanTests.swift +0 -279
- package/Tests/RunicTests/GeminiStatusProbeTests.swift +0 -232
- package/Tests/RunicTests/GeminiTestEnvironment.swift +0 -87
- package/Tests/RunicTests/GoogleWorkspaceStatusTests.swift +0 -72
- package/Tests/RunicTests/InstallOriginTests.swift +0 -17
- package/Tests/RunicTests/KeyboardShortcutsBundleTests.swift +0 -9
- package/Tests/RunicTests/LiveAccountTests.swift +0 -24
- package/Tests/RunicTests/LoadingPatternTests.swift +0 -34
- package/Tests/RunicTests/MenuCardModelTests.swift +0 -544
- package/Tests/RunicTests/MiniMaxCookieHeaderStoreTestSupport.swift +0 -11
- package/Tests/RunicTests/MiniMaxGroupIDStoreTestSupport.swift +0 -11
- package/Tests/RunicTests/MiniMaxParsingTests.swift +0 -67
- package/Tests/RunicTests/MiniMaxTokenStoreTestSupport.swift +0 -11
- package/Tests/RunicTests/OTelGenAILedgerAdapterTests.swift +0 -110
- package/Tests/RunicTests/OpenAIDashboardBrowserCookieImporterTests.swift +0 -16
- package/Tests/RunicTests/OpenAIDashboardFetcherCreditsWaitTests.swift +0 -74
- package/Tests/RunicTests/OpenAIDashboardOffscreenHostTests.swift +0 -26
- package/Tests/RunicTests/OpenAIDashboardParserTests.swift +0 -133
- package/Tests/RunicTests/OpenAIWebAccountSwitchTests.swift +0 -64
- package/Tests/RunicTests/OpenRouterTokenStoreTestSupport.swift +0 -131
- package/Tests/RunicTests/PathBuilderTests.swift +0 -236
- package/Tests/RunicTests/ProviderFetchPipelineTests.swift +0 -159
- package/Tests/RunicTests/ProviderIconResourcesTests.swift +0 -37
- package/Tests/RunicTests/ProviderMetadataStatusLinkTests.swift +0 -15
- package/Tests/RunicTests/ProviderRegistryTests.swift +0 -29
- package/Tests/RunicTests/ProviderSettingsDescriptorTests.swift +0 -236
- package/Tests/RunicTests/ProviderToggleStoreTests.swift +0 -50
- package/Tests/RunicTests/RunicTests.swift +0 -119
- package/Tests/RunicTests/SessionQuotaNotificationLogicTests.swift +0 -35
- package/Tests/RunicTests/SettingsStoreTests.swift +0 -265
- package/Tests/RunicTests/StatusItemAnimationTests.swift +0 -54
- package/Tests/RunicTests/StatusMenuTests.swift +0 -475
- package/Tests/RunicTests/StatusProbeTests.swift +0 -376
- package/Tests/RunicTests/SubprocessRunnerTests.swift +0 -18
- package/Tests/RunicTests/SubscriptionDetectionTests.swift +0 -64
- package/Tests/RunicTests/TTYCommandRunnerTests.swift +0 -147
- package/Tests/RunicTests/TTYIntegrationTests.swift +0 -41
- package/Tests/RunicTests/TeamShowbackExporterTests.swift +0 -157
- package/Tests/RunicTests/TextParsingTests.swift +0 -11
- package/Tests/RunicTests/UsageFormatterTests.swift +0 -111
- package/Tests/RunicTests/UsageLedgerAnomalyDetectionTests.swift +0 -170
- package/Tests/RunicTests/UsageLedgerForecastTests.swift +0 -211
- package/Tests/RunicTests/UsageLedgerInsightsAdvisorTests.swift +0 -81
- package/Tests/RunicTests/UsageLedgerProjectNameTests.swift +0 -168
- package/Tests/RunicTests/UsagePaceTests.swift +0 -76
- package/Tests/RunicTests/UsagePaceTextTests.swift +0 -108
- package/Tests/RunicTests/UsagePolicyEngineTests.swift +0 -89
- package/Tests/RunicTests/WidgetSnapshotTests.swift +0 -43
- package/Tests/RunicTests/ZaiProviderTests.swift +0 -59
- package/Tests/RunicTests/ZaiTokenStoreTestSupport.swift +0 -9
- package/TestsLinux/PlatformGatingTests.swift +0 -46
- package/appcast.xml +0 -104
- package/assets/logo-concept-stack.svg +0 -24
- package/assets/logo-minimal-bars.svg +0 -15
- package/assets/logo.svg +0 -20
- package/assets/logo2.svg +0 -43
- package/bin/docs-list +0 -5
- package/build-and-run.sh +0 -369
- package/docs/.nojekyll +0 -1
- package/docs/CNAME +0 -1
- package/docs/antigravity.md +0 -75
- package/docs/architecture.md +0 -32
- package/docs/claude.md +0 -93
- package/docs/cli-commands/integration_guide.md +0 -371
- package/docs/cli-commands/quick_reference.md +0 -362
- package/docs/cli-commands/readme.md +0 -361
- package/docs/cli.md +0 -156
- package/docs/cloudkit_sync_guide.md +0 -495
- package/docs/codebase_review.md +0 -288
- package/docs/codex-oauth.md +0 -635
- package/docs/codex.md +0 -104
- package/docs/codexbar.png +0 -0
- package/docs/copilot.md +0 -44
- package/docs/cursor.md +0 -46
- package/docs/design/designcomparisonchart.md +0 -510
- package/docs/design/implementationguide.md +0 -792
- package/docs/design/menubaricondesignconcepts.md +0 -796
- package/docs/design/mockups/hybridiconconcept.svg +0 -62
- package/docs/design/mockups/infinityiconconcept.svg +0 -41
- package/docs/design/mockups/infinityiconstates.svg +0 -129
- package/docs/design/mockups/wavelogorefined.svg +0 -48
- package/docs/design/quick_summary.md +0 -426
- package/docs/design/readme.md +0 -478
- package/docs/design/sizespecifications.md +0 -575
- package/docs/design-system.md +0 -836
- package/docs/factory.md +0 -103
- package/docs/gemini.md +0 -73
- package/docs/icon.md +0 -37
- package/docs/icon.png +0 -0
- package/docs/index.html +0 -175
- package/docs/keychain_fix.md +0 -274
- package/docs/minimax.md +0 -71
- package/docs/packaging.md +0 -25
- package/docs/progress-bar-improvements.md +0 -240
- package/docs/progress-bar-quick-reference.md +0 -283
- package/docs/progress-bar-technical-details.md +0 -432
- package/docs/progress-bar-visual-test.swift +0 -375
- package/docs/provider.md +0 -202
- package/docs/providers.md +0 -86
- package/docs/refactor/macros.md +0 -35
- package/docs/refresh-loop.md +0 -22
- package/docs/releasing-homebrew.md +0 -35
- package/docs/releasing.md +0 -121
- package/docs/research/concrete_todo_2026-02-22.md +0 -47
- package/docs/research/core-feature-research.md +0 -248
- package/docs/research/feature_uiux_roadmap_2026-02-22.md +0 -202
- package/docs/research/parity_matrix.md +0 -49
- package/docs/research/provider_expansion_candidates_2026-02-22.md +0 -80
- package/docs/research/provider_model_token_project_matrix_2026-02-23.md +0 -46
- package/docs/research/release_gate_checklist.md +0 -57
- package/docs/site.css +0 -505
- package/docs/sparkle.md +0 -28
- package/docs/status.md +0 -28
- package/docs/sync/implementation.md +0 -393
- package/docs/sync/readme.md +0 -317
- package/docs/sync_files_summary.md +0 -391
- package/docs/sync_quick_reference.md +0 -225
- package/docs/todo.md +0 -11
- package/docs/ui.md +0 -29
- package/docs/web-integration.md +0 -9
- package/docs/widgets.md +0 -85
- package/docs/workflows/error-handling-improvements.md +0 -434
- package/docs/workflows/folder_structure.md +0 -299
- package/docs/workflows/loading_states.md +0 -446
- package/docs/workflows/loading_states_examples.md +0 -565
- package/docs/workflows/loading_states_flow.md +0 -430
- package/docs/workflows/performance_optimizations.md +0 -457
- package/docs/workflows/phase1-cli-testing-report.md +0 -313
- package/docs/workflows/quick_reference.md +0 -228
- package/docs/workflows/readme.md +0 -59
- package/docs/workflows/recent_improvements.md +0 -275
- package/docs/workflows/sync_enablement_summary.md +0 -400
- package/docs/zai.md +0 -43
- package/runic.png +0 -0
- package/runic.svg +0 -15
- package/version.env +0 -2
|
@@ -1,575 +0,0 @@
|
|
|
1
|
-
# Runic Menubar Icon - Size Specifications
|
|
2
|
-
|
|
3
|
-
**Technical Reference for macOS Menubar Icon Rendering**
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## macOS Menubar Guidelines
|
|
8
|
-
|
|
9
|
-
### Apple Human Interface Guidelines
|
|
10
|
-
|
|
11
|
-
**Recommended Sizes:**
|
|
12
|
-
- **Standard:** 18-22pt (square or proportional)
|
|
13
|
-
- **Detailed:** Up to 28pt for complex icons
|
|
14
|
-
- **Spacing:** 2pt padding from edges (safe area)
|
|
15
|
-
|
|
16
|
-
**Display Considerations:**
|
|
17
|
-
- **Retina (@2x):** All icons must provide 2× pixel density assets
|
|
18
|
-
- **Non-Retina (@1x):** Maintain backward compatibility
|
|
19
|
-
- **Dark Mode:** Template rendering adapts automatically
|
|
20
|
-
- **Positioning:** Vertically centered in menubar (22pt tall menubar)
|
|
21
|
-
|
|
22
|
-
**Template Image Requirements:**
|
|
23
|
-
- Single-channel alpha (black with alpha channel)
|
|
24
|
-
- System colorizes based on menubar theme
|
|
25
|
-
- No embedded colors (except in vibrant mode)
|
|
26
|
-
- Smooth anti-aliasing for curves
|
|
27
|
-
|
|
28
|
-
---
|
|
29
|
-
|
|
30
|
-
## Runic Icon Specifications
|
|
31
|
-
|
|
32
|
-
### Current Implementation
|
|
33
|
-
|
|
34
|
-
**File:** `IconRenderer.swift` (Lines 51-56)
|
|
35
|
-
|
|
36
|
-
```swift
|
|
37
|
-
private static let baseSize = NSSize(width: 38, height: 22)
|
|
38
|
-
private static let outputSize = NSSize(width: 38, height: 22)
|
|
39
|
-
private static let outputScale: CGFloat = 2
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
**Analysis:**
|
|
43
|
-
- **Points:** 38×22pt (width × height)
|
|
44
|
-
- **Pixels (@2x):** 76×44px
|
|
45
|
-
- **Aspect ratio:** ~1.73:1 (rectangular, not square)
|
|
46
|
-
- **Actual rendered height:** 22pt (matches macOS menubar height)
|
|
47
|
-
|
|
48
|
-
**Why Rectangular?**
|
|
49
|
-
- Wider icon provides more space for usage bars
|
|
50
|
-
- Horizontal orientation fits menubar layout
|
|
51
|
-
- Wave shape naturally extends horizontally
|
|
52
|
-
|
|
53
|
-
---
|
|
54
|
-
|
|
55
|
-
## Recommended Sizes by Design
|
|
56
|
-
|
|
57
|
-
### Option A: Infinity Symbol + Provider Icon
|
|
58
|
-
|
|
59
|
-
**Recommended Size:** 40×24pt (80×48px @2x)
|
|
60
|
-
|
|
61
|
-
#### Dimensions Breakdown
|
|
62
|
-
|
|
63
|
-
| Element | Points | Pixels @2x | Notes |
|
|
64
|
-
|---------|--------|------------|-------|
|
|
65
|
-
| **Total Width** | 40pt | 80px | +2pt from current for breathing room |
|
|
66
|
-
| **Total Height** | 24pt | 48px | +2pt from current for clarity |
|
|
67
|
-
| **Infinity Stroke** | 4pt | 8px | Thick enough to be visible, not overwhelming |
|
|
68
|
-
| **Loop Diameter** | 14pt | 28px | Per loop (left and right) |
|
|
69
|
-
| **Loop Radius** | 7pt | 14px | From center of each loop |
|
|
70
|
-
| **Center Gap Width** | 10-12pt | 20-24px | Space for provider icon |
|
|
71
|
-
| **Center Gap Height** | 12-14pt | 24-28px | Vertical space for provider icon |
|
|
72
|
-
| **Provider Icon** | 8×8pt | 16×16px | Fits comfortably in center gap |
|
|
73
|
-
| **Safe Padding** | 2pt | 4px | From edges to infinity loops |
|
|
74
|
-
|
|
75
|
-
#### Scaling Options
|
|
76
|
-
|
|
77
|
-
| Size Preset | Points | Use Case | Legibility |
|
|
78
|
-
|-------------|--------|----------|------------|
|
|
79
|
-
| **Small** | 36×20pt | Compact menubar | ★★★☆☆ |
|
|
80
|
-
| **Medium** | 40×24pt | Recommended | ★★★★★ |
|
|
81
|
-
| **Large** | 44×28pt | High-DPI/accessibility | ★★★★★ |
|
|
82
|
-
|
|
83
|
-
**Recommendation:** Use **40×24pt** as default for best balance.
|
|
84
|
-
|
|
85
|
-
---
|
|
86
|
-
|
|
87
|
-
### Option B: Wave Logo (Current)
|
|
88
|
-
|
|
89
|
-
**Current Size:** 38×22pt (76×44px @2x)
|
|
90
|
-
|
|
91
|
-
#### Refinement Proposal: 42×26pt (84×52px @2x)
|
|
92
|
-
|
|
93
|
-
| Element | Current | Proposed | Change |
|
|
94
|
-
|---------|---------|----------|--------|
|
|
95
|
-
| **Total Width** | 38pt | 42pt | +4pt |
|
|
96
|
-
| **Total Height** | 22pt | 26pt | +4pt |
|
|
97
|
-
| **Wave Stroke** | 18px | 20px | +2px (thicker) |
|
|
98
|
-
| **Center Circle** | 32px | 36px | +4px (larger) |
|
|
99
|
-
| **Bar Width** | 8px | 10px | +2px (more visible) |
|
|
100
|
-
| **Bar Max Height** | 22-26px | 26-32px | +4-6px (taller) |
|
|
101
|
-
|
|
102
|
-
**Rationale:**
|
|
103
|
-
- Larger bars easier to read
|
|
104
|
-
- More vertical space reduces cramping
|
|
105
|
-
- Maintains aspect ratio (~1.6:1)
|
|
106
|
-
|
|
107
|
-
---
|
|
108
|
-
|
|
109
|
-
### Option C: Hybrid
|
|
110
|
-
|
|
111
|
-
**Recommended Size:** 40×24pt (80×48px @2x)
|
|
112
|
-
|
|
113
|
-
#### Dimensions Breakdown
|
|
114
|
-
|
|
115
|
-
| Element | Points | Pixels @2x | Notes |
|
|
116
|
-
|---------|--------|------------|-------|
|
|
117
|
-
| **Total Width** | 40pt | 80px | Same as Option A |
|
|
118
|
-
| **Total Height** | 24pt | 48px | Same as Option A |
|
|
119
|
-
| **Infinity Stroke** | 3pt | 6px | Thinner outline (frame only) |
|
|
120
|
-
| **Loop Radius** | 7pt | 14px | Same as Option A |
|
|
121
|
-
| **Center Bar Width** | 8pt | 16px | Narrower than gap (10-12pt) |
|
|
122
|
-
| **Center Bar Height** | 12pt | 24px | Nearly full gap height |
|
|
123
|
-
| **Bar Corner Radius** | 3pt | 6px | Rounded for modern look |
|
|
124
|
-
| **Provider Badge** | 6×6pt | 12×12px | Small circle in corner |
|
|
125
|
-
| **Badge Stroke** | 1.5pt | 3px | Outline around badge |
|
|
126
|
-
|
|
127
|
-
---
|
|
128
|
-
|
|
129
|
-
## Pixel-Perfect Rendering
|
|
130
|
-
|
|
131
|
-
### Alignment Rules (@2x Scale)
|
|
132
|
-
|
|
133
|
-
**All coordinates must be even numbers at 2× to avoid sub-pixel rendering:**
|
|
134
|
-
|
|
135
|
-
```swift
|
|
136
|
-
// GOOD: Aligns to pixel grid
|
|
137
|
-
let x = 20.0 // → 40px @ 2x ✓
|
|
138
|
-
let y = 12.0 // → 24px @ 2x ✓
|
|
139
|
-
|
|
140
|
-
// BAD: Sub-pixel rendering (blurry)
|
|
141
|
-
let x = 20.5 // → 41px @ 2x (half-pixel) ✗
|
|
142
|
-
let y = 12.3 // → 24.6px @ 2x (fractional) ✗
|
|
143
|
-
```
|
|
144
|
-
|
|
145
|
-
**Helper Function (from IconRenderer.swift):**
|
|
146
|
-
|
|
147
|
-
```swift
|
|
148
|
-
private static func snap(_ value: CGFloat) -> CGFloat {
|
|
149
|
-
(value * self.outputScale).rounded() / self.outputScale
|
|
150
|
-
}
|
|
151
|
-
```
|
|
152
|
-
|
|
153
|
-
**Usage:**
|
|
154
|
-
```swift
|
|
155
|
-
let iconX = snap(15.5) // → 16.0 (aligned)
|
|
156
|
-
let iconY = snap(11.7) // → 12.0 (aligned)
|
|
157
|
-
```
|
|
158
|
-
|
|
159
|
-
---
|
|
160
|
-
|
|
161
|
-
## SVG Viewbox Specifications
|
|
162
|
-
|
|
163
|
-
### Current Wave Logo
|
|
164
|
-
|
|
165
|
-
**File:** `RunicMenubarIcon.svg`
|
|
166
|
-
|
|
167
|
-
```xml
|
|
168
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="46 78 164 100" fill="none">
|
|
169
|
-
```
|
|
170
|
-
|
|
171
|
-
**Analysis:**
|
|
172
|
-
- **Viewbox:** 46,78 → 210,178 (164×100 effective area)
|
|
173
|
-
- **Aspect ratio:** 1.64:1
|
|
174
|
-
- **Renders to:** 38×22pt via IconRenderer scaling
|
|
175
|
-
|
|
176
|
-
### Recommended Infinity SVG
|
|
177
|
-
|
|
178
|
-
**File:** `RunicMenubarIconInfinity.svg` (new)
|
|
179
|
-
|
|
180
|
-
```xml
|
|
181
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 80 48" fill="none">
|
|
182
|
-
```
|
|
183
|
-
|
|
184
|
-
**Analysis:**
|
|
185
|
-
- **Viewbox:** 0,0 → 80,48 (80×48 total area)
|
|
186
|
-
- **Aspect ratio:** 1.67:1
|
|
187
|
-
- **Maps 1:1** to 40×24pt @ 2× (80×48px)
|
|
188
|
-
- **Simpler** than current (no offset origin)
|
|
189
|
-
|
|
190
|
-
**Advantages:**
|
|
191
|
-
- Clean origin at (0, 0)
|
|
192
|
-
- Direct pixel mapping
|
|
193
|
-
- Easier to edit and position elements
|
|
194
|
-
|
|
195
|
-
---
|
|
196
|
-
|
|
197
|
-
## Provider Icon Sizing
|
|
198
|
-
|
|
199
|
-
### In Infinity Design
|
|
200
|
-
|
|
201
|
-
**Available Space:** 10-12pt wide × 12-14pt tall (center gap)
|
|
202
|
-
|
|
203
|
-
**Recommended Icon Size:** 8×8pt (16×16px @2x)
|
|
204
|
-
|
|
205
|
-
**Padding:** 1-2pt around icon for breathing room
|
|
206
|
-
|
|
207
|
-
### Existing Provider Icons (from IconRenderer.swift)
|
|
208
|
-
|
|
209
|
-
| Provider | Sigil Type | Dimensions | Fits in 8×8pt? |
|
|
210
|
-
|----------|-----------|------------|----------------|
|
|
211
|
-
| **Claude** | Vertical slits | 2×6pt each | ✓ Yes |
|
|
212
|
-
| **Codex** | Square eyes | 3×3pt each | ✓ Yes |
|
|
213
|
-
| **Gemini** | Diamond | 8pt diagonal | ✓ Yes (exactly) |
|
|
214
|
-
| **Cursor** | Arrow | 6pt tall | ✓ Yes |
|
|
215
|
-
| **Copilot** | Circular eyes | 6pt diameter | ✓ Yes |
|
|
216
|
-
| **Minimax** | Triangles | 6×5pt | ✓ Yes |
|
|
217
|
-
| **OpenRouter** | Ring | 8pt diameter | ✓ Yes (exactly) |
|
|
218
|
-
| **Groq** | Slash | 2×8pt | ⚠ Tight (8pt tall) |
|
|
219
|
-
| **Zai** | Double slash | 7pt tall | ✓ Yes |
|
|
220
|
-
|
|
221
|
-
**Conclusion:** All existing provider sigils fit comfortably in 8×8pt space.
|
|
222
|
-
|
|
223
|
-
### In Hybrid Design (Badge)
|
|
224
|
-
|
|
225
|
-
**Badge Size:** 6×6pt (12×12px @2x)
|
|
226
|
-
|
|
227
|
-
**Icon Size:** 4×4pt (8×8px @2x) inside badge
|
|
228
|
-
|
|
229
|
-
**Challenge:** Icons need to scale down 50% from main design.
|
|
230
|
-
|
|
231
|
-
**Solution:**
|
|
232
|
-
- Simplify icons for badge (minimal detail)
|
|
233
|
-
- Use single dots or letters as fallback
|
|
234
|
-
- Example: Claude = "C", Codex = "<>"
|
|
235
|
-
|
|
236
|
-
---
|
|
237
|
-
|
|
238
|
-
## Display Testing Matrix
|
|
239
|
-
|
|
240
|
-
### Test on Real Devices
|
|
241
|
-
|
|
242
|
-
| Display | Resolution | Scale | Test Size | Expected Result |
|
|
243
|
-
|---------|-----------|-------|-----------|-----------------|
|
|
244
|
-
| **MacBook Air M1** | 2560×1600 | 2× | 40×24pt | Sharp, clear |
|
|
245
|
-
| **MacBook Pro 16"** | 3456×2234 | 2× | 40×24pt | Sharp, clear |
|
|
246
|
-
| **iMac 27" 5K** | 5120×2880 | 2× | 40×24pt | Sharp, clear |
|
|
247
|
-
| **Mac mini + 1080p** | 1920×1080 | 1× | 40×24pt | Clear, slight blur |
|
|
248
|
-
| **Mac Studio + 4K** | 3840×2160 | 2× | 40×24pt | Sharp, clear |
|
|
249
|
-
|
|
250
|
-
### Size Comparison at Different DPI
|
|
251
|
-
|
|
252
|
-
| Size | @1× (72 DPI) | @2× (144 DPI) | Visual Result |
|
|
253
|
-
|------|-------------|---------------|---------------|
|
|
254
|
-
| **18pt** | 18×18px | 36×36px | Minimum legible |
|
|
255
|
-
| **22pt** | 22×22px | 44×44px | Standard menubar |
|
|
256
|
-
| **24pt** | 24×24px | 48×48px | Recommended (clear) |
|
|
257
|
-
| **28pt** | 28×28px | 56×56px | Large (accessibility) |
|
|
258
|
-
|
|
259
|
-
**Runic Recommended:** 24pt height (Option A & C) or 26pt (Option B refined)
|
|
260
|
-
|
|
261
|
-
---
|
|
262
|
-
|
|
263
|
-
## Color & Opacity Specifications
|
|
264
|
-
|
|
265
|
-
### Template Mode (Default)
|
|
266
|
-
|
|
267
|
-
**Colors:**
|
|
268
|
-
- **Light Mode:** NSColor.labelColor (black ~85% opacity)
|
|
269
|
-
- **Dark Mode:** NSColor.labelColor (white ~85% opacity)
|
|
270
|
-
- **System Managed:** No manual color specification
|
|
271
|
-
|
|
272
|
-
**Opacity Modifiers:**
|
|
273
|
-
- **Normal State:** 100% (uses labelColor directly)
|
|
274
|
-
- **Stale Data:** 55% opacity
|
|
275
|
-
- **Disabled:** 30% opacity
|
|
276
|
-
|
|
277
|
-
### Vibrant Mode (Optional)
|
|
278
|
-
|
|
279
|
-
**Pressure Color Palette:**
|
|
280
|
-
|
|
281
|
-
| State | Usage Range | Hex Color | RGB | Opacity |
|
|
282
|
-
|-------|------------|-----------|-----|---------|
|
|
283
|
-
| **Safe** | 0-50% | #14B8A6 | (20, 184, 166) | 100% |
|
|
284
|
-
| **Warning** | 50-80% | #FFB84D | (255, 184, 77) | 100% |
|
|
285
|
-
| **Critical** | 80-100% | #FF4F70 | (255, 79, 112) | 100% |
|
|
286
|
-
| **Stale** | Any | (inherit) | — | 55% |
|
|
287
|
-
|
|
288
|
-
**Secondary Colors (from current design):**
|
|
289
|
-
|
|
290
|
-
| Element | Color | Hex | RGB |
|
|
291
|
-
|---------|-------|-----|-----|
|
|
292
|
-
| **Primary Stroke** | Teal 500 | #14B8A6 | (20, 184, 166) |
|
|
293
|
-
| **Accent Fill** | Teal 400 | #2DD4BF | (45, 212, 191) |
|
|
294
|
-
| **Dark Fill** | Teal 700 | #0F766E | (15, 118, 110) |
|
|
295
|
-
|
|
296
|
-
---
|
|
297
|
-
|
|
298
|
-
## Animation Specifications
|
|
299
|
-
|
|
300
|
-
### Morph Animations (Launch/Close)
|
|
301
|
-
|
|
302
|
-
**Current Implementation (Lines 668-755):**
|
|
303
|
-
- Duration: 0.5s (morphBucketCount = 200 frames)
|
|
304
|
-
- Frame rate: 60 FPS
|
|
305
|
-
- Easing: Linear (custom easing possible)
|
|
306
|
-
|
|
307
|
-
**Infinity Morph:**
|
|
308
|
-
- Start: Three separate ribbons
|
|
309
|
-
- End: Infinity symbol
|
|
310
|
-
- Method: Bezier curve interpolation
|
|
311
|
-
|
|
312
|
-
**Cache:**
|
|
313
|
-
- 200 morph frames × 3 designs = 600 cached images
|
|
314
|
-
- Limited by PerformanceConstants.morphCacheSize (512)
|
|
315
|
-
|
|
316
|
-
### Pulse Animations (Syncing)
|
|
317
|
-
|
|
318
|
-
**Parameters:**
|
|
319
|
-
```swift
|
|
320
|
-
// Subtle pulse during sync
|
|
321
|
-
let pulse = sin(CACurrentMediaTime() * 2) * 0.15 + 0.85
|
|
322
|
-
iconColor = baseColor.withAlphaComponent(pulse)
|
|
323
|
-
```
|
|
324
|
-
|
|
325
|
-
**Specs:**
|
|
326
|
-
- Frequency: 0.5 Hz (2-second period)
|
|
327
|
-
- Amplitude: ±15% opacity
|
|
328
|
-
- Baseline: 85% opacity
|
|
329
|
-
|
|
330
|
-
### Blink Animations (Errors)
|
|
331
|
-
|
|
332
|
-
**Current Implementation (Lines 204-205):**
|
|
333
|
-
```swift
|
|
334
|
-
// Disabled to prevent flicker
|
|
335
|
-
let opacityMultiplier = 1.0
|
|
336
|
-
```
|
|
337
|
-
|
|
338
|
-
**If Re-enabled:**
|
|
339
|
-
- Duration: 0.2s per blink
|
|
340
|
-
- Repetitions: 3× for critical errors
|
|
341
|
-
- Opacity: 100% ↔ 30%
|
|
342
|
-
|
|
343
|
-
---
|
|
344
|
-
|
|
345
|
-
## Accessibility Specifications
|
|
346
|
-
|
|
347
|
-
### High Contrast Mode
|
|
348
|
-
|
|
349
|
-
**macOS System Setting:** Increase Contrast
|
|
350
|
-
|
|
351
|
-
**Icon Adjustments:**
|
|
352
|
-
- **Stroke Width:** +1pt (thicker)
|
|
353
|
-
- **Opacity:** Boost to 100% (remove transparency)
|
|
354
|
-
- **Colors:** Use maximum saturation
|
|
355
|
-
|
|
356
|
-
**Example:**
|
|
357
|
-
```swift
|
|
358
|
-
if NSWorkspace.shared.accessibilityDisplayShouldIncreaseContrast {
|
|
359
|
-
strokeWidth = 5.0 // instead of 4.0
|
|
360
|
-
opacity = 1.0 // instead of 0.85
|
|
361
|
-
}
|
|
362
|
-
```
|
|
363
|
-
|
|
364
|
-
### Reduced Motion
|
|
365
|
-
|
|
366
|
-
**macOS System Setting:** Reduce Motion
|
|
367
|
-
|
|
368
|
-
**Icon Adjustments:**
|
|
369
|
-
- Disable all animations (blink, pulse, morph)
|
|
370
|
-
- Use static icons only
|
|
371
|
-
- Instant state changes (no transitions)
|
|
372
|
-
|
|
373
|
-
**Example:**
|
|
374
|
-
```swift
|
|
375
|
-
if NSWorkspace.shared.accessibilityDisplayShouldReduceMotion {
|
|
376
|
-
// Skip morph animation, show final state immediately
|
|
377
|
-
return IconRenderer.makeIcon(..., blink: 0, wiggle: 0, tilt: 0)
|
|
378
|
-
}
|
|
379
|
-
```
|
|
380
|
-
|
|
381
|
-
### VoiceOver
|
|
382
|
-
|
|
383
|
-
**Icon Description Template:**
|
|
384
|
-
|
|
385
|
-
**Option A:**
|
|
386
|
-
```
|
|
387
|
-
"Runic monitoring icon. Infinity symbol with [Provider Name] in center. Usage level: [Color] ([Percentage]%). [Status]."
|
|
388
|
-
```
|
|
389
|
-
|
|
390
|
-
**Example:**
|
|
391
|
-
```
|
|
392
|
-
"Runic monitoring icon. Infinity symbol with Claude in center. Usage level: Orange (65%). Data is current."
|
|
393
|
-
```
|
|
394
|
-
|
|
395
|
-
**Option B:**
|
|
396
|
-
```
|
|
397
|
-
"Runic monitoring icon. Session usage: [X]%, Weekly usage: [Y]%, Credits remaining: [Z]%. [Status]."
|
|
398
|
-
```
|
|
399
|
-
|
|
400
|
-
**Implementation:**
|
|
401
|
-
```swift
|
|
402
|
-
statusItem.button?.accessibilityLabel = """
|
|
403
|
-
Runic monitoring icon. Infinity symbol with \(providerName) in center. \
|
|
404
|
-
Usage level: \(pressureColorName) (\(percentage)%). \(staleness).
|
|
405
|
-
"""
|
|
406
|
-
```
|
|
407
|
-
|
|
408
|
-
---
|
|
409
|
-
|
|
410
|
-
## File Format Specifications
|
|
411
|
-
|
|
412
|
-
### SVG Export Settings
|
|
413
|
-
|
|
414
|
-
**For Infinity Icon:**
|
|
415
|
-
|
|
416
|
-
```xml
|
|
417
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
|
418
|
-
<svg xmlns="http://www.w3.org/2000/svg"
|
|
419
|
-
viewBox="0 0 80 48"
|
|
420
|
-
fill="none"
|
|
421
|
-
width="80"
|
|
422
|
-
height="48">
|
|
423
|
-
<!-- Icon content -->
|
|
424
|
-
</svg>
|
|
425
|
-
```
|
|
426
|
-
|
|
427
|
-
**Requirements:**
|
|
428
|
-
- **Encoding:** UTF-8
|
|
429
|
-
- **Namespace:** xmlns="http://www.w3.org/2000/svg"
|
|
430
|
-
- **ViewBox:** Match output pixels (80×48)
|
|
431
|
-
- **Precision:** 2 decimal places max
|
|
432
|
-
- **Optimization:** Remove metadata, comments in production
|
|
433
|
-
|
|
434
|
-
**Export Tools:**
|
|
435
|
-
- **Illustrator:** Export As → SVG → "Responsive" viewBox
|
|
436
|
-
- **Figma:** Export SVG → Outline stroke
|
|
437
|
-
- **Sketch:** Export SVG → "Use relative dimensions"
|
|
438
|
-
|
|
439
|
-
### NSImage Import
|
|
440
|
-
|
|
441
|
-
**IconRenderer.swift Pattern:**
|
|
442
|
-
|
|
443
|
-
```swift
|
|
444
|
-
private static let infinityLogoTemplate: NSImage? = {
|
|
445
|
-
guard let url = Bundle.main.url(
|
|
446
|
-
forResource: "RunicMenubarIconInfinity",
|
|
447
|
-
withExtension: "svg"),
|
|
448
|
-
let image = NSImage(contentsOf: url) else {
|
|
449
|
-
return nil
|
|
450
|
-
}
|
|
451
|
-
return image
|
|
452
|
-
}()
|
|
453
|
-
```
|
|
454
|
-
|
|
455
|
-
**Rendering:**
|
|
456
|
-
|
|
457
|
-
```swift
|
|
458
|
-
infinityLogo.draw(
|
|
459
|
-
in: rect,
|
|
460
|
-
from: .zero,
|
|
461
|
-
operation: .sourceOver,
|
|
462
|
-
fraction: 1.0
|
|
463
|
-
)
|
|
464
|
-
```
|
|
465
|
-
|
|
466
|
-
---
|
|
467
|
-
|
|
468
|
-
## Testing Checklist
|
|
469
|
-
|
|
470
|
-
### Visual Testing
|
|
471
|
-
|
|
472
|
-
- [ ] Renders sharply on Retina display (@2x)
|
|
473
|
-
- [ ] Renders acceptably on non-Retina display (@1x)
|
|
474
|
-
- [ ] Template mode adapts to light menubar theme
|
|
475
|
-
- [ ] Template mode adapts to dark menubar theme
|
|
476
|
-
- [ ] Vibrant mode displays correct colors
|
|
477
|
-
- [ ] All provider icons visible and recognizable
|
|
478
|
-
- [ ] Stale state reduces opacity to 55%
|
|
479
|
-
- [ ] Status indicators (minor, major, critical) render correctly
|
|
480
|
-
- [ ] No blurry edges (pixel-aligned)
|
|
481
|
-
- [ ] Smooth anti-aliasing on curves
|
|
482
|
-
|
|
483
|
-
### Size Testing
|
|
484
|
-
|
|
485
|
-
- [ ] Legible at 18pt (minimum)
|
|
486
|
-
- [ ] Clear at 22pt (standard)
|
|
487
|
-
- [ ] Excellent at 24pt (recommended)
|
|
488
|
-
- [ ] Excellent at 28pt (large)
|
|
489
|
-
- [ ] Scales proportionally at all sizes
|
|
490
|
-
- [ ] No cropping at edges
|
|
491
|
-
- [ ] Maintains aspect ratio
|
|
492
|
-
|
|
493
|
-
### Accessibility Testing
|
|
494
|
-
|
|
495
|
-
- [ ] High contrast mode increases visibility
|
|
496
|
-
- [ ] Reduced motion disables animations
|
|
497
|
-
- [ ] VoiceOver announces icon state correctly
|
|
498
|
-
- [ ] Tooltip shows detailed information on hover
|
|
499
|
-
- [ ] Keyboard shortcut opens menu
|
|
500
|
-
|
|
501
|
-
### Performance Testing
|
|
502
|
-
|
|
503
|
-
- [ ] First render <10ms
|
|
504
|
-
- [ ] Cached render <0.5ms
|
|
505
|
-
- [ ] Cache hit rate >80%
|
|
506
|
-
- [ ] Memory footprint <5MB (cache + templates)
|
|
507
|
-
- [ ] No memory leaks (verify with Instruments)
|
|
508
|
-
- [ ] Animation maintains 60 FPS
|
|
509
|
-
|
|
510
|
-
---
|
|
511
|
-
|
|
512
|
-
## Summary
|
|
513
|
-
|
|
514
|
-
### Recommended Specifications
|
|
515
|
-
|
|
516
|
-
**Size:** 40×24pt (80×48px @2x)
|
|
517
|
-
- Optimal balance of clarity and menubar fit
|
|
518
|
-
- +2pt from current for improved legibility
|
|
519
|
-
- Works well for all three design options
|
|
520
|
-
|
|
521
|
-
**Rendering:**
|
|
522
|
-
- Template mode by default (system theme adaptation)
|
|
523
|
-
- Vibrant mode as user preference option
|
|
524
|
-
- 2× scale for Retina displays
|
|
525
|
-
- Pixel-perfect alignment
|
|
526
|
-
|
|
527
|
-
**Provider Icons:**
|
|
528
|
-
- 8×8pt in infinity center gap
|
|
529
|
-
- All existing sigils fit comfortably
|
|
530
|
-
- Clear visibility and recognition
|
|
531
|
-
|
|
532
|
-
**Colors:**
|
|
533
|
-
- Pressure mapping: Teal (safe) → Orange (warning) → Red (critical)
|
|
534
|
-
- Stale state: 55% opacity
|
|
535
|
-
- Template: NSColor.labelColor (automatic)
|
|
536
|
-
|
|
537
|
-
**Performance:**
|
|
538
|
-
- Cache 50-100 icon variations
|
|
539
|
-
- Render in <10ms (first) or <0.5ms (cached)
|
|
540
|
-
- 60 FPS animations
|
|
541
|
-
|
|
542
|
-
**Accessibility:**
|
|
543
|
-
- High contrast support
|
|
544
|
-
- Reduced motion compliance
|
|
545
|
-
- VoiceOver descriptions
|
|
546
|
-
- Keyboard shortcut access
|
|
547
|
-
|
|
548
|
-
---
|
|
549
|
-
|
|
550
|
-
## Reference Implementation
|
|
551
|
-
|
|
552
|
-
```swift
|
|
553
|
-
// Complete size configuration for Option A
|
|
554
|
-
private static let baseSize = NSSize(width: 40, height: 24)
|
|
555
|
-
private static let outputSize = NSSize(width: 40, height: 24)
|
|
556
|
-
private static let outputScale: CGFloat = 2
|
|
557
|
-
|
|
558
|
-
// Infinity path specifications
|
|
559
|
-
private static let infinityStrokeWidth: CGFloat = 4
|
|
560
|
-
private static let infinityLoopRadius: CGFloat = 7
|
|
561
|
-
private static let infinityCenterGapWidth: CGFloat = 12
|
|
562
|
-
private static let infinityCenterGapHeight: CGFloat = 14
|
|
563
|
-
|
|
564
|
-
// Provider icon specifications
|
|
565
|
-
private static let providerIconSize: CGFloat = 8
|
|
566
|
-
private static let providerIconPadding: CGFloat = 2
|
|
567
|
-
|
|
568
|
-
// Color specifications
|
|
569
|
-
private static let safeColor = NSColor(calibratedRed: 0.08, green: 0.72, blue: 0.65, alpha: 1.0) // #14B8A6
|
|
570
|
-
private static let warningColor = NSColor(calibratedRed: 1.00, green: 0.72, blue: 0.30, alpha: 1.0) // #FFB84D
|
|
571
|
-
private static let criticalColor = NSColor(calibratedRed: 1.00, green: 0.31, blue: 0.44, alpha: 1.0) // #FF4F70
|
|
572
|
-
private static let staleOpacity: CGFloat = 0.55
|
|
573
|
-
```
|
|
574
|
-
|
|
575
|
-
This completes the comprehensive size specification document for Runic's menubar icon designs.
|