@sriinnu/runic 1.2.0 → 2.11.1
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 +267 -0
- package/LICENSE +373 -21
- package/README.md +98 -84
- 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/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 -115
- package/Sources/Runic/Controllers/StatusItemController+Actions.swift +0 -666
- package/Sources/Runic/Controllers/StatusItemController+Animation.swift +0 -518
- package/Sources/Runic/Controllers/StatusItemController+ChartSubmenus.swift +0 -810
- package/Sources/Runic/Controllers/StatusItemController+CustomProviders.swift +0 -87
- package/Sources/Runic/Controllers/StatusItemController+Menu.swift +0 -1407
- package/Sources/Runic/Controllers/StatusItemController+MenuCards.swift +0 -337
- package/Sources/Runic/Controllers/StatusItemController+MenuHelpers.swift +0 -395
- package/Sources/Runic/Controllers/StatusItemController.swift +0 -360
- package/Sources/Runic/Core/BudgetNotificationManager.swift +0 -80
- 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 -1216
- package/Sources/Runic/Core/Rendering/IconView.swift +0 -120
- 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/Stores/AuggieTokenStore.swift +0 -119
- package/Sources/Runic/Core/Stores/AzureOpenAITokenStore.swift +0 -119
- package/Sources/Runic/Core/Stores/CerebrasTokenStore.swift +0 -119
- package/Sources/Runic/Core/Stores/CohereTokenStore.swift +0 -119
- package/Sources/Runic/Core/Stores/CopilotTokenStore.swift +0 -119
- package/Sources/Runic/Core/Stores/CustomProviderStore.swift +0 -158
- package/Sources/Runic/Core/Stores/DeepSeekTokenStore.swift +0 -119
- package/Sources/Runic/Core/Stores/FireworksTokenStore.swift +0 -119
- package/Sources/Runic/Core/Stores/GroqTokenStore.swift +0 -119
- package/Sources/Runic/Core/Stores/KimiTokenStore.swift +0 -119
- package/Sources/Runic/Core/Stores/MiniMaxCookieHeaderStore.swift +0 -119
- package/Sources/Runic/Core/Stores/MiniMaxGroupIDStore.swift +0 -119
- package/Sources/Runic/Core/Stores/MiniMaxTokenStore.swift +0 -119
- package/Sources/Runic/Core/Stores/MistralTokenStore.swift +0 -119
- package/Sources/Runic/Core/Stores/OpenRouterTokenStore.swift +0 -119
- package/Sources/Runic/Core/Stores/PerplexityTokenStore.swift +0 -119
- package/Sources/Runic/Core/Stores/ProviderToggleStore.swift +0 -30
- package/Sources/Runic/Core/Stores/QwenTokenStore.swift +0 -119
- package/Sources/Runic/Core/Stores/SambaNovaTokenStore.swift +0 -119
- package/Sources/Runic/Core/Stores/SettingsStore.swift +0 -1711
- package/Sources/Runic/Core/Stores/TogetherTokenStore.swift +0 -119
- package/Sources/Runic/Core/Stores/UsageStore+Accessors.swift +0 -20
- 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 -3605
- package/Sources/Runic/Core/Stores/XAITokenStore.swift +0 -119
- package/Sources/Runic/Core/Stores/ZaiTokenStore.swift +0 -118
- package/Sources/Runic/Core/UsageExporter.swift +0 -193
- 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 -48
- 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/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 -357
- package/Sources/Runic/SessionQuotaNotifications.swift +0 -58
- package/Sources/Runic/UsagePaceText.swift +0 -52
- package/Sources/Runic/UsageProgressBar.swift +0 -224
- package/Sources/Runic/Utilities/DisplayLink.swift +0 -96
- package/Sources/Runic/Utilities/LoadingPattern.swift +0 -60
- package/Sources/Runic/Utilities/PerformanceConstants.swift +0 -85
- package/Sources/Runic/Views/Menu/AlertsMenuView.swift +0 -256
- 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 -312
- package/Sources/Runic/Views/Menu/HeroStatCardsMenuView.swift +0 -228
- package/Sources/Runic/Views/Menu/HourlyActivityChartMenuView.swift +0 -228
- package/Sources/Runic/Views/Menu/InlineUsageChartView.swift +0 -155
- package/Sources/Runic/Views/Menu/MenuCardEntranceModifier.swift +0 -64
- package/Sources/Runic/Views/Menu/MenuCardSidebarView.swift +0 -268
- package/Sources/Runic/Views/Menu/MenuCardSkeletonView.swift +0 -104
- package/Sources/Runic/Views/Menu/MenuCardView.swift +0 -1900
- package/Sources/Runic/Views/Menu/MenuContent.swift +0 -150
- package/Sources/Runic/Views/Menu/MenuDescriptor.swift +0 -369
- package/Sources/Runic/Views/Menu/MenuHighlightStyle.swift +0 -42
- package/Sources/Runic/Views/Menu/ModelBreakdownMenuView.swift +0 -235
- package/Sources/Runic/Views/Menu/OverviewMenuView.swift +0 -278
- package/Sources/Runic/Views/Menu/ProjectBreakdownMenuView.swift +0 -209
- package/Sources/Runic/Views/Menu/ProjectBudgetMenuView.swift +0 -220
- package/Sources/Runic/Views/Menu/ProviderTabBarView.swift +0 -88
- package/Sources/Runic/Views/Menu/SubscriptionUtilizationChartMenuView.swift +0 -201
- package/Sources/Runic/Views/Menu/UsageBreakdownChartMenuView.swift +0 -398
- package/Sources/Runic/Views/Menu/UsageHeatmapMenuView.swift +0 -232
- package/Sources/Runic/Views/Menu/UsageTimelineChartMenuView.swift +0 -364
- package/Sources/Runic/Views/Menu/UsageWindowComparisonChartMenuView.swift +0 -190
- package/Sources/Runic/Views/Menu/WeeklyActivityChartMenuView.swift +0 -132
- package/Sources/Runic/Views/Performance/PerformanceDashboardView.swift +0 -618
- package/Sources/Runic/Views/Preferences/LiquidComponents.swift +0 -305
- 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 -422
- package/Sources/Runic/Views/Preferences/PreferencesAnalyticsPane.swift +0 -641
- 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 -322
- package/Sources/Runic/Views/Preferences/PreferencesDebugPane.swift +0 -469
- package/Sources/Runic/Views/Preferences/PreferencesGeneralPane.swift +0 -231
- package/Sources/Runic/Views/Preferences/PreferencesHelpPane.swift +0 -50
- package/Sources/Runic/Views/Preferences/PreferencesIntegrationsPane.swift +0 -567
- package/Sources/Runic/Views/Preferences/PreferencesPerformancePane.swift +0 -288
- package/Sources/Runic/Views/Preferences/PreferencesProvidersPane.swift +0 -3435
- package/Sources/Runic/Views/Preferences/PreferencesSelection.swift +0 -25
- package/Sources/Runic/Views/Preferences/PreferencesSyncPane.swift +0 -59
- package/Sources/Runic/Views/Preferences/PreferencesView.swift +0 -206
- package/Sources/Runic/Views/Rating/QualityRatingView.swift +0 -238
- package/Sources/Runic/Views/Team/TeamDashboardView.swift +0 -371
- package/Sources/Runic/Views/Team/TeamInviteSheet.swift +0 -175
- package/Sources/Runic/Views/Team/TeamManagementView.swift +0 -761
- package/Sources/Runic/Views/Team/TeamMemberRow.swift +0 -181
- package/Sources/RunicCLI/CLIEntry.swift +0 -942
- package/Sources/RunicCLI/CLIRenderer.swift +0 -87
- package/Sources/RunicCLI/Commands/EnhancedUsageCommand.swift +0 -588
- package/Sources/RunicCLI/Commands/ModelsCommand.swift +0 -362
- package/Sources/RunicCLI/Commands/ProjectsCommand.swift +0 -439
- package/Sources/RunicCLI/Commands/ResetCommand.swift +0 -429
- package/Sources/RunicCLI/Commands/UsageLedgerSourceFactory.swift +0 -168
- 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 -269
- package/Sources/RunicCore/CustomProviders/GenericProviderFetcher.swift +0 -633
- package/Sources/RunicCore/CustomProviders/ProviderTemplates.swift +0 -500
- 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 -371
- 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 -409
- package/Sources/RunicCore/Policy/UsagePolicyEngine.swift +0 -178
- package/Sources/RunicCore/ProjectBudgetStore.swift +0 -99
- package/Sources/RunicCore/ProviderCostSnapshot.swift +0 -29
- package/Sources/RunicCore/Providers/Antigravity/AntigravityProviderDescriptor.swift +0 -66
- 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 -168
- 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 -207
- package/Sources/RunicCore/Providers/Claude/ClaudeStatusProbe.swift +0 -654
- package/Sources/RunicCore/Providers/Claude/ClaudeUsageDataSource.swift +0 -28
- 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 -243
- package/Sources/RunicCore/Providers/Codex/CodexStatusProbe.swift +0 -125
- package/Sources/RunicCore/Providers/Codex/CodexUsageDataSource.swift +0 -24
- package/Sources/RunicCore/Providers/Codex/CodexWebDashboardStrategy.swift +0 -181
- 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 -114
- package/Sources/RunicCore/Providers/Copilot/CopilotProviderDescriptor.swift +0 -100
- package/Sources/RunicCore/Providers/Copilot/CopilotUsageFetcher.swift +0 -291
- package/Sources/RunicCore/Providers/Copilot/CopilotVSCodeTokenReader.swift +0 -386
- package/Sources/RunicCore/Providers/Cursor/CursorProviderDescriptor.swift +0 -65
- 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 -65
- 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 -65
- package/Sources/RunicCore/Providers/Gemini/GeminiStatusProbe.swift +0 -836
- 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 -92
- 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 -203
- 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 -84
- package/Sources/RunicCore/Providers/Qwen/QwenSettingsReader.swift +0 -30
- package/Sources/RunicCore/Providers/Qwen/QwenUsageStats.swift +0 -315
- 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 -72
- package/Sources/RunicCore/Providers/Zai/ZaiSettingsReader.swift +0 -41
- package/Sources/RunicCore/Providers/Zai/ZaiUsageStats.swift +0 -718
- package/Sources/RunicCore/Sync/BackgroundSyncManager.swift +0 -385
- package/Sources/RunicCore/Sync/SyncConflictResolver.swift +0 -310
- package/Sources/RunicCore/Sync/SyncProtocol.swift +0 -288
- package/Sources/RunicCore/Sync/SyncRecord.swift +0 -405
- package/Sources/RunicCore/Sync/SyncUsageExample.swift +0 -294
- package/Sources/RunicCore/Sync/TeamSyncRecords.swift +0 -775
- package/Sources/RunicCore/Sync/iCloudSyncEngine.swift +0 -333
- package/Sources/RunicCore/Team/TeamModels.swift +0 -583
- package/Sources/RunicCore/Team/TeamShowbackExporter.swift +0 -495
- package/Sources/RunicCore/Team/TeamStore.swift +0 -792
- 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 -427
- package/Sources/RunicCore/UsageLedger/CodexUsageLogSource.swift +0 -494
- package/Sources/RunicCore/UsageLedger/LedgerCache.swift +0 -158
- package/Sources/RunicCore/UsageLedger/OTelGenAILedgerAdapter.swift +0 -550
- package/Sources/RunicCore/UsageLedger/UsageLedger.swift +0 -29
- package/Sources/RunicCore/UsageLedger/UsageLedgerAggregator.swift +0 -660
- package/Sources/RunicCore/UsageLedger/UsageLedgerInsightsAdvisor.swift +0 -209
- package/Sources/RunicCore/UsageLedger/UsageLedgerModels.swift +0 -417
- package/Sources/RunicCore/UsageLedger/UsageLedgerProjectIdentity.swift +0 -245
- 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 -43
- package/Tests/RunicTests/BrowserCookieOrderLabelTests.swift +0 -22
- package/Tests/RunicTests/CLIArgumentParsingTests.swift +0 -70
- package/Tests/RunicTests/CLICostTests.swift +0 -65
- package/Tests/RunicTests/CLIProviderSelectionTests.swift +0 -22
- package/Tests/RunicTests/CLISnapshotTests.swift +0 -72
- package/Tests/RunicTests/CLIWebFallbackTests.swift +0 -58
- package/Tests/RunicTests/ClaudeOAuthTests.swift +0 -164
- package/Tests/RunicTests/ClaudeResilienceTests.swift +0 -30
- package/Tests/RunicTests/ClaudeUsageTests.swift +0 -370
- package/Tests/RunicTests/CodexOAuthTests.swift +0 -122
- package/Tests/RunicTests/CodexUsageLogSourceTests.swift +0 -82
- package/Tests/RunicTests/CopilotTokenResolverTests.swift +0 -75
- package/Tests/RunicTests/CopilotVSCodeTokenReaderTests.swift +0 -75
- package/Tests/RunicTests/CostUsageDecodingTests.swift +0 -394
- package/Tests/RunicTests/CostUsagePricingTests.swift +0 -50
- package/Tests/RunicTests/CostUsageScannerTests.swift +0 -700
- package/Tests/RunicTests/CursorStatusProbeTests.swift +0 -323
- package/Tests/RunicTests/FactoryStatusProbeTests.swift +0 -69
- package/Tests/RunicTests/GeminiAPITestHelpers.swift +0 -94
- package/Tests/RunicTests/GeminiLoginAlertTests.swift +0 -28
- package/Tests/RunicTests/GeminiStatusProbeAPITests.swift +0 -283
- package/Tests/RunicTests/GeminiStatusProbePlanTests.swift +0 -279
- package/Tests/RunicTests/GeminiStatusProbeTests.swift +0 -233
- package/Tests/RunicTests/GeminiTestEnvironment.swift +0 -87
- package/Tests/RunicTests/GoogleWorkspaceStatusTests.swift +0 -73
- package/Tests/RunicTests/InstallOriginTests.swift +0 -18
- package/Tests/RunicTests/KeyboardShortcutsBundleTests.swift +0 -9
- package/Tests/RunicTests/LiveAccountTests.swift +0 -24
- package/Tests/RunicTests/LoadingPatternTests.swift +0 -35
- package/Tests/RunicTests/MenuCardModelTests.swift +0 -545
- package/Tests/RunicTests/MiniMaxCookieHeaderStoreTestSupport.swift +0 -8
- package/Tests/RunicTests/MiniMaxGroupIDStoreTestSupport.swift +0 -8
- package/Tests/RunicTests/MiniMaxParsingTests.swift +0 -68
- package/Tests/RunicTests/MiniMaxTokenStoreTestSupport.swift +0 -8
- package/Tests/RunicTests/OTelGenAILedgerAdapterTests.swift +0 -112
- package/Tests/RunicTests/OpenAIDashboardBrowserCookieImporterTests.swift +0 -17
- package/Tests/RunicTests/OpenAIDashboardFetcherCreditsWaitTests.swift +0 -75
- package/Tests/RunicTests/OpenAIDashboardOffscreenHostTests.swift +0 -27
- package/Tests/RunicTests/OpenAIDashboardParserTests.swift +0 -134
- package/Tests/RunicTests/OpenAIWebAccountSwitchTests.swift +0 -53
- package/Tests/RunicTests/OpenRouterTokenStoreTestSupport.swift +0 -92
- package/Tests/RunicTests/PathBuilderTests.swift +0 -237
- package/Tests/RunicTests/ProviderFetchPipelineTests.swift +0 -160
- package/Tests/RunicTests/ProviderIconResourcesTests.swift +0 -38
- package/Tests/RunicTests/ProviderMetadataStatusLinkTests.swift +0 -16
- package/Tests/RunicTests/ProviderRegistryTests.swift +0 -29
- package/Tests/RunicTests/ProviderSettingsDescriptorTests.swift +0 -202
- package/Tests/RunicTests/ProviderToggleStoreTests.swift +0 -51
- package/Tests/RunicTests/RunicTests.swift +0 -120
- package/Tests/RunicTests/SessionQuotaNotificationLogicTests.swift +0 -36
- package/Tests/RunicTests/SettingsStoreTests.swift +0 -161
- package/Tests/RunicTests/StatusItemAnimationTests.swift +0 -49
- package/Tests/RunicTests/StatusMenuTests.swift +0 -434
- package/Tests/RunicTests/StatusProbeTests.swift +0 -377
- package/Tests/RunicTests/SubprocessRunnerTests.swift +0 -20
- package/Tests/RunicTests/SubscriptionDetectionTests.swift +0 -65
- package/Tests/RunicTests/TTYCommandRunnerTests.swift +0 -148
- package/Tests/RunicTests/TTYIntegrationTests.swift +0 -41
- package/Tests/RunicTests/TeamShowbackExporterTests.swift +0 -159
- package/Tests/RunicTests/TextParsingTests.swift +0 -12
- package/Tests/RunicTests/UsageFormatterTests.swift +0 -112
- package/Tests/RunicTests/UsageLedgerAnomalyDetectionTests.swift +0 -172
- package/Tests/RunicTests/UsageLedgerForecastTests.swift +0 -213
- package/Tests/RunicTests/UsageLedgerInsightsAdvisorTests.swift +0 -83
- package/Tests/RunicTests/UsageLedgerProjectNameTests.swift +0 -170
- package/Tests/RunicTests/UsagePaceTests.swift +0 -77
- package/Tests/RunicTests/UsagePaceTextTests.swift +0 -109
- package/Tests/RunicTests/UsagePolicyEngineTests.swift +0 -91
- package/Tests/RunicTests/WidgetSnapshotTests.swift +0 -45
- package/Tests/RunicTests/ZaiProviderTests.swift +0 -61
- package/Tests/RunicTests/ZaiTokenStoreTestSupport.swift +0 -6
- package/TestsLinux/PlatformGatingTests.swift +0 -46
- package/appcast.xml +0 -144
- 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/version.env +0 -2
package/docs/design-system.md
DELETED
|
@@ -1,836 +0,0 @@
|
|
|
1
|
-
# Runic Design System
|
|
2
|
-
|
|
3
|
-
**Version:** 1.0
|
|
4
|
-
**Last Updated:** January 31, 2026
|
|
5
|
-
|
|
6
|
-
This document defines the comprehensive design system for Runic's preferences UI and throughout the application. Following these guidelines ensures visual consistency, accessibility, and maintainability across all panes and components.
|
|
7
|
-
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
## Table of Contents
|
|
11
|
-
|
|
12
|
-
1. [Typography Scale](#typography-scale)
|
|
13
|
-
2. [Spacing System](#spacing-system)
|
|
14
|
-
3. [Color Palette](#color-palette)
|
|
15
|
-
4. [Component Patterns](#component-patterns)
|
|
16
|
-
5. [Status Indicators](#status-indicators)
|
|
17
|
-
6. [Best Practices](#best-practices)
|
|
18
|
-
|
|
19
|
-
---
|
|
20
|
-
|
|
21
|
-
## Typography Scale
|
|
22
|
-
|
|
23
|
-
Runic uses SwiftUI's semantic typography system with consistent font choices across the application.
|
|
24
|
-
|
|
25
|
-
### Section Titles
|
|
26
|
-
**Usage:** Top-level section headers in preferences panes
|
|
27
|
-
|
|
28
|
-
- **Font:** `.caption`
|
|
29
|
-
- **Weight:** System default
|
|
30
|
-
- **Color:** `.secondary`
|
|
31
|
-
- **Transform:** `.textCase(.uppercase)`
|
|
32
|
-
- **Example:** "SYSTEM", "USAGE", "AUTO-REFRESH SAFETY"
|
|
33
|
-
|
|
34
|
-
```swift
|
|
35
|
-
Text("Section Title")
|
|
36
|
-
.font(.caption)
|
|
37
|
-
.foregroundStyle(.secondary)
|
|
38
|
-
.textCase(.uppercase)
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
### Subsection Headers
|
|
42
|
-
**Usage:** Settings section titles, card headers
|
|
43
|
-
|
|
44
|
-
- **Font:** `.subheadline.weight(.semibold)` or `.body.weight(.medium)`
|
|
45
|
-
- **Weight:** `.semibold` or `.medium`
|
|
46
|
-
- **Color:** Primary text (default)
|
|
47
|
-
- **Example:** "Refresh cadence", "Credits", "Cost"
|
|
48
|
-
|
|
49
|
-
```swift
|
|
50
|
-
Text("Subsection Header")
|
|
51
|
-
.font(.subheadline.weight(.semibold))
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
### Body Text
|
|
55
|
-
**Usage:** Primary labels, toggle titles, setting descriptions
|
|
56
|
-
|
|
57
|
-
- **Font:** `.body`
|
|
58
|
-
- **Weight:** System default
|
|
59
|
-
- **Color:** Primary text (default)
|
|
60
|
-
- **Example:** "Start at Login", "Show cost summary"
|
|
61
|
-
|
|
62
|
-
```swift
|
|
63
|
-
Text("Setting Label")
|
|
64
|
-
.font(.body)
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
### Captions & Metadata
|
|
68
|
-
**Usage:** Supplementary information, help text, timestamps
|
|
69
|
-
|
|
70
|
-
- **Font:** `.footnote` or `.caption`
|
|
71
|
-
- **Weight:** System default
|
|
72
|
-
- **Color:** `.tertiary` or `.secondary`
|
|
73
|
-
- **Line Limit:** Often uses `.fixedSize(horizontal: false, vertical: true)` for multi-line
|
|
74
|
-
- **Example:** "Automatically opens Runic when you start your Mac."
|
|
75
|
-
|
|
76
|
-
```swift
|
|
77
|
-
Text("Helper text explaining the setting above.")
|
|
78
|
-
.font(.footnote)
|
|
79
|
-
.foregroundStyle(.tertiary)
|
|
80
|
-
.fixedSize(horizontal: false, vertical: true)
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
### Small Metadata
|
|
84
|
-
**Usage:** Tiny labels, status badges
|
|
85
|
-
|
|
86
|
-
- **Font:** `.caption2.weight(.medium)` or `.caption`
|
|
87
|
-
- **Weight:** `.medium` or `.semibold`
|
|
88
|
-
- **Color:** `.secondary`
|
|
89
|
-
- **Example:** Badge labels in advanced settings
|
|
90
|
-
|
|
91
|
-
```swift
|
|
92
|
-
Text("Badge Text")
|
|
93
|
-
.font(.caption2.weight(.medium))
|
|
94
|
-
.foregroundStyle(.secondary)
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
### Monospace Text
|
|
98
|
-
**Usage:** Debug output, JSON display, technical data
|
|
99
|
-
|
|
100
|
-
- **Font:** `.system(.footnote, design: .monospaced)` or `.system(.callout, design: .monospaced)`
|
|
101
|
-
- **When to use:**
|
|
102
|
-
- Debug pane data display
|
|
103
|
-
- File paths
|
|
104
|
-
- JSON/technical content
|
|
105
|
-
- Version numbers in technical contexts
|
|
106
|
-
|
|
107
|
-
```swift
|
|
108
|
-
Text(jsonOutput)
|
|
109
|
-
.font(.system(.footnote, design: .monospaced))
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
---
|
|
113
|
-
|
|
114
|
-
## Spacing System
|
|
115
|
-
|
|
116
|
-
Runic uses the `RunicSpacing` enum for all spacing values, based on a **4pt grid system**. All spacing values are multiples of 4 for consistent visual rhythm.
|
|
117
|
-
|
|
118
|
-
### Base Spacing Scale
|
|
119
|
-
|
|
120
|
-
Located in `/Sources/Runic/Core/RunicSpacing.swift`:
|
|
121
|
-
|
|
122
|
-
| Constant | Value | Points | Use Cases |
|
|
123
|
-
|----------|-------|--------|-----------|
|
|
124
|
-
| `xxxs` | 2pt | Extra extra extra small | Minimal gaps, fine-tuning |
|
|
125
|
-
| `xxs` | 4pt | Extra extra small | Line spacing, tight vertical gaps |
|
|
126
|
-
| `xs` | 8pt | Extra small | Row spacing, compact sections |
|
|
127
|
-
| `sm` | 12pt | Small | Horizontal element spacing, comfortable gaps |
|
|
128
|
-
| `md` | 16pt | Medium | Section padding, moderate separation |
|
|
129
|
-
| `lg` | 24pt | Large | Major section spacing |
|
|
130
|
-
| `xl` | 32pt | Extra large | Page-level spacing (rare) |
|
|
131
|
-
| `xxl` | 48pt | Extra extra large | Maximum spacing (rare) |
|
|
132
|
-
|
|
133
|
-
### Semantic Spacing Constants
|
|
134
|
-
|
|
135
|
-
#### Menu Spacing
|
|
136
|
-
```swift
|
|
137
|
-
static let menuHorizontalPadding: CGFloat = sm // 12pt
|
|
138
|
-
static let menuVerticalPadding: CGFloat = xs // 8pt
|
|
139
|
-
static let cardSpacing: CGFloat = xs // 8pt
|
|
140
|
-
```
|
|
141
|
-
|
|
142
|
-
#### Preferences Spacing
|
|
143
|
-
```swift
|
|
144
|
-
static let compact: CGFloat = 6 // Between sm and xs
|
|
145
|
-
static let toggleRowSpacing: CGFloat = xs // 8pt
|
|
146
|
-
static let sectionHeaderSpacing: CGFloat = md // 16pt
|
|
147
|
-
static let stepperControlSpacing: CGFloat = xs // 8pt
|
|
148
|
-
```
|
|
149
|
-
|
|
150
|
-
#### General Section Spacing
|
|
151
|
-
```swift
|
|
152
|
-
static let sectionSpacing: CGFloat = lg // 24pt
|
|
153
|
-
```
|
|
154
|
-
|
|
155
|
-
### Vertical Spacing Between Sections
|
|
156
|
-
|
|
157
|
-
- **Between major settings groups:** `PreferencesLayoutMetrics.paneSpacing` (24pt)
|
|
158
|
-
- **Between section header and content:** `PreferencesLayoutMetrics.sectionHeaderSpacing` (16pt)
|
|
159
|
-
- **Within a section between items:** `PreferencesLayoutMetrics.sectionSpacing` (20pt)
|
|
160
|
-
- **Toggle rows internal spacing:** `RunicSpacing.xs` (8pt)
|
|
161
|
-
|
|
162
|
-
### Horizontal Padding Standards
|
|
163
|
-
|
|
164
|
-
- **Pane horizontal padding:** `PreferencesLayoutMetrics.paneHorizontal` (36pt)
|
|
165
|
-
- **Pane vertical padding:** `PreferencesLayoutMetrics.paneVertical` (24pt)
|
|
166
|
-
- **Menu card horizontal padding:** `MenuCardMetrics.horizontalPadding` / `RunicSpacing.sm` (12pt)
|
|
167
|
-
- **Field horizontal padding:** `RunicSpacing.xs` (8pt)
|
|
168
|
-
|
|
169
|
-
### Row Spacing in Lists
|
|
170
|
-
|
|
171
|
-
**Provider List Metrics:**
|
|
172
|
-
```swift
|
|
173
|
-
static let rowSpacing: CGFloat = RunicSpacing.sm // 12pt horizontal
|
|
174
|
-
static let providerVerticalSpacing: CGFloat = RunicSpacing.md // 16pt vertical
|
|
175
|
-
static let sectionSpacing: CGFloat = RunicSpacing.lg // 24pt between sections
|
|
176
|
-
```
|
|
177
|
-
|
|
178
|
-
**Row Insets:**
|
|
179
|
-
```swift
|
|
180
|
-
static let rowInsets = EdgeInsets(
|
|
181
|
-
top: RunicSpacing.md, // 16pt
|
|
182
|
-
leading: contentInset, // 36pt
|
|
183
|
-
bottom: RunicSpacing.md, // 16pt
|
|
184
|
-
trailing: contentInset // 36pt
|
|
185
|
-
)
|
|
186
|
-
```
|
|
187
|
-
|
|
188
|
-
### Visual Examples
|
|
189
|
-
|
|
190
|
-
```
|
|
191
|
-
xxxs (2pt): •· Fine adjustment, padding tweaks
|
|
192
|
-
xxs (4pt): •·· Line spacing, divider padding
|
|
193
|
-
xs (8pt): •···· Toggle row spacing, card spacing
|
|
194
|
-
sm (12pt): •······ Element gaps, stepper spacing
|
|
195
|
-
md (16pt): •········ Section header spacing, row padding
|
|
196
|
-
lg (24pt): •············ Major section spacing
|
|
197
|
-
xl (32pt): •················ Rare large gaps
|
|
198
|
-
xxl (48pt): •························ Maximum spacing
|
|
199
|
-
```
|
|
200
|
-
|
|
201
|
-
---
|
|
202
|
-
|
|
203
|
-
## Color Palette
|
|
204
|
-
|
|
205
|
-
Runic leverages macOS system colors for native appearance and automatic dark mode support.
|
|
206
|
-
|
|
207
|
-
### Primary Colors
|
|
208
|
-
|
|
209
|
-
- **Accent Color:** System accent color (user-customizable)
|
|
210
|
-
- Used for: Links, primary actions, selected states
|
|
211
|
-
- Access: `.accentColor`
|
|
212
|
-
|
|
213
|
-
### Text Colors
|
|
214
|
-
|
|
215
|
-
| Hierarchy | SwiftUI Color | NSColor Equivalent | Usage |
|
|
216
|
-
|-----------|---------------|-------------------|-------|
|
|
217
|
-
| **Primary** | Default | `.controlTextColor` | Main labels, titles, body text |
|
|
218
|
-
| **Secondary** | `.secondary` | `.secondaryLabelColor` | Subtitles, metadata, supporting text |
|
|
219
|
-
| **Tertiary** | `.tertiary` | `.tertiaryLabelColor` | Help text, captions, least important text |
|
|
220
|
-
|
|
221
|
-
**Menu Highlight Text Colors:**
|
|
222
|
-
```swift
|
|
223
|
-
MenuHighlightStyle.selectionText // .selectedMenuItemTextColor
|
|
224
|
-
MenuHighlightStyle.normalPrimaryText // .controlTextColor
|
|
225
|
-
MenuHighlightStyle.normalSecondaryText // .secondaryLabelColor
|
|
226
|
-
```
|
|
227
|
-
|
|
228
|
-
### Background Colors
|
|
229
|
-
|
|
230
|
-
| Purpose | NSColor | Usage |
|
|
231
|
-
|---------|---------|-------|
|
|
232
|
-
| **Control Background** | `.controlBackgroundColor` | Text fields, stepper value displays, cards |
|
|
233
|
-
| **Text Background** | `.textBackgroundColor` | Input areas, editable regions |
|
|
234
|
-
| **Window Background** | System default | Main window backgrounds |
|
|
235
|
-
| **Selection** | `.selectedContentBackgroundColor` | Selected list items, highlighted rows |
|
|
236
|
-
| **Separator** | `.separatorColor` | Dividers between sections |
|
|
237
|
-
|
|
238
|
-
### Status Colors
|
|
239
|
-
|
|
240
|
-
#### Success
|
|
241
|
-
- **Color:** `.systemGreen` / `.green`
|
|
242
|
-
- **Usage:** Successful operations, positive states
|
|
243
|
-
- **Example:** "Success: 200 OK" webhook test
|
|
244
|
-
|
|
245
|
-
#### Warning
|
|
246
|
-
- **Color:** `.systemOrange` / `.orange`
|
|
247
|
-
- **Usage:** Alerts, cautionary states
|
|
248
|
-
- **Example:** Warning severity badges, high usage alerts
|
|
249
|
-
|
|
250
|
-
#### Error
|
|
251
|
-
- **Color:** `.systemRed` / `.red`
|
|
252
|
-
- **Usage:** Error messages, critical states, delete actions
|
|
253
|
-
- **Access:** `Color(nsColor: .systemRed)` or `MenuHighlightStyle.error(highlighted)`
|
|
254
|
-
|
|
255
|
-
#### Info
|
|
256
|
-
- **Color:** `.systemBlue` / `.blue`
|
|
257
|
-
- **Usage:** Informational states, neutral indicators
|
|
258
|
-
- **Example:** Info severity badges
|
|
259
|
-
|
|
260
|
-
#### Critical Badge Colors
|
|
261
|
-
```swift
|
|
262
|
-
case .info: return .blue
|
|
263
|
-
case .warning: return .orange
|
|
264
|
-
case .critical: return .red
|
|
265
|
-
```
|
|
266
|
-
|
|
267
|
-
### Border/Divider Colors
|
|
268
|
-
|
|
269
|
-
- **Standard Divider:** `Color(nsColor: .separatorColor)`
|
|
270
|
-
- **Thickness:** 1pt (system standard)
|
|
271
|
-
- **Vertical Padding:** `RunicSpacing.xxs` (4pt) on both sides
|
|
272
|
-
|
|
273
|
-
```swift
|
|
274
|
-
Divider()
|
|
275
|
-
.padding(.vertical, RunicSpacing.xxs)
|
|
276
|
-
```
|
|
277
|
-
|
|
278
|
-
### Provider Brand Colors
|
|
279
|
-
|
|
280
|
-
Provider-specific colors from `ProviderDescriptorRegistry`:
|
|
281
|
-
```swift
|
|
282
|
-
let color = ProviderDescriptorRegistry.descriptor(for: provider).branding.color
|
|
283
|
-
Color(red: color.red, green: color.green, blue: color.blue)
|
|
284
|
-
```
|
|
285
|
-
|
|
286
|
-
### Opacity Conventions
|
|
287
|
-
|
|
288
|
-
- **Disabled states:** `0.5` opacity
|
|
289
|
-
- **Subtle backgrounds:** `0.2` opacity (e.g., badge backgrounds)
|
|
290
|
-
- **Hover effects:** `0.18` opacity for pressed states
|
|
291
|
-
- **Progress track:** `0.22` opacity
|
|
292
|
-
|
|
293
|
-
---
|
|
294
|
-
|
|
295
|
-
## Component Patterns
|
|
296
|
-
|
|
297
|
-
### Toggle Rows
|
|
298
|
-
|
|
299
|
-
**Layout:** Checkbox on left, title/subtitle stacked on right
|
|
300
|
-
|
|
301
|
-
**Spacing:**
|
|
302
|
-
- Internal vertical spacing: `RunicSpacing.xs` (8pt)
|
|
303
|
-
- Padding top for checkbox alignment: `RunicSpacing.xxs` (4pt)
|
|
304
|
-
|
|
305
|
-
**Typography:**
|
|
306
|
-
- Title: `.font(.body)`
|
|
307
|
-
- Subtitle: `.font(.footnote)`, `.foregroundStyle(.tertiary)`
|
|
308
|
-
|
|
309
|
-
**Implementation:**
|
|
310
|
-
```swift
|
|
311
|
-
VStack(alignment: .leading, spacing: RunicSpacing.xs) {
|
|
312
|
-
Toggle(isOn: self.$binding) {
|
|
313
|
-
Text(self.title)
|
|
314
|
-
.font(.body)
|
|
315
|
-
}
|
|
316
|
-
.toggleStyle(.checkbox)
|
|
317
|
-
|
|
318
|
-
if let subtitle, !subtitle.isEmpty {
|
|
319
|
-
Text(subtitle)
|
|
320
|
-
.font(.footnote)
|
|
321
|
-
.foregroundStyle(.tertiary)
|
|
322
|
-
.fixedSize(horizontal: false, vertical: true)
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
```
|
|
326
|
-
|
|
327
|
-
### Section Headers
|
|
328
|
-
|
|
329
|
-
**Style:**
|
|
330
|
-
- Small caps uppercase text
|
|
331
|
-
- Secondary color for reduced hierarchy
|
|
332
|
-
- Caption font size
|
|
333
|
-
|
|
334
|
-
**Spacing:**
|
|
335
|
-
- Bottom spacing: `PreferencesLayoutMetrics.sectionHeaderSpacing` (16pt)
|
|
336
|
-
|
|
337
|
-
**Implementation:**
|
|
338
|
-
```swift
|
|
339
|
-
Text("Section Title")
|
|
340
|
-
.font(.caption)
|
|
341
|
-
.foregroundStyle(.secondary)
|
|
342
|
-
.textCase(.uppercase)
|
|
343
|
-
```
|
|
344
|
-
|
|
345
|
-
### Cards/Containers
|
|
346
|
-
|
|
347
|
-
**Padding:**
|
|
348
|
-
- Internal padding: `RunicSpacing.xs` (8pt)
|
|
349
|
-
- Alert/rule rows: `RunicSpacing.xs` all sides
|
|
350
|
-
|
|
351
|
-
**Corner Radius:**
|
|
352
|
-
- Standard: `6pt` rounded corners
|
|
353
|
-
- Small elements: `4pt` (badges, small buttons)
|
|
354
|
-
|
|
355
|
-
**Background:**
|
|
356
|
-
- `Color(nsColor: .controlBackgroundColor)`
|
|
357
|
-
- Selected/hover: `.opacity(0.5)` or `.selectedContentBackgroundColor`
|
|
358
|
-
|
|
359
|
-
**Implementation:**
|
|
360
|
-
```swift
|
|
361
|
-
HStack {
|
|
362
|
-
// Content
|
|
363
|
-
}
|
|
364
|
-
.padding(RunicSpacing.xs)
|
|
365
|
-
.background(Color(nsColor: .controlBackgroundColor))
|
|
366
|
-
.cornerRadius(6)
|
|
367
|
-
```
|
|
368
|
-
|
|
369
|
-
### Buttons
|
|
370
|
-
|
|
371
|
-
#### Sizes & Control Sizes
|
|
372
|
-
- **Large:** `.controlSize(.large)` - Used for prominent actions (e.g., "Quit Runic")
|
|
373
|
-
- **Regular:** Default - Standard actions
|
|
374
|
-
- **Small:** `.controlSize(.small)` - Secondary actions, compact layouts
|
|
375
|
-
- **Mini:** `.controlSize(.mini)` - Very small contexts (e.g., "Ack" button)
|
|
376
|
-
|
|
377
|
-
#### Styles
|
|
378
|
-
- **Bordered:** `.buttonStyle(.bordered)` - Standard secondary buttons
|
|
379
|
-
- **Bordered Prominent:** `.buttonStyle(.borderedProminent)` - Primary actions
|
|
380
|
-
- **Plain:** `.buttonStyle(.plain)` - Text-only, minimal chrome
|
|
381
|
-
- **Link:** `.buttonStyle(.link)` - Hyperlink appearance
|
|
382
|
-
|
|
383
|
-
#### Spacing
|
|
384
|
-
- Button groups: `RunicSpacing.xs` (8pt) or `RunicSpacing.sm` (12pt) between buttons
|
|
385
|
-
|
|
386
|
-
**Implementation:**
|
|
387
|
-
```swift
|
|
388
|
-
HStack(spacing: RunicSpacing.xs) {
|
|
389
|
-
Button("Secondary") { }
|
|
390
|
-
.buttonStyle(.bordered)
|
|
391
|
-
.controlSize(.small)
|
|
392
|
-
|
|
393
|
-
Button("Primary") { }
|
|
394
|
-
.buttonStyle(.borderedProminent)
|
|
395
|
-
.controlSize(.large)
|
|
396
|
-
}
|
|
397
|
-
```
|
|
398
|
-
|
|
399
|
-
### Text Fields
|
|
400
|
-
|
|
401
|
-
**Height:** System default based on control size
|
|
402
|
-
|
|
403
|
-
**Padding:**
|
|
404
|
-
- Horizontal: `RunicSpacing.xs` (8pt)
|
|
405
|
-
- Vertical: `RunicSpacing.xxs` (4pt)
|
|
406
|
-
|
|
407
|
-
**Border:** Provided by `.textFieldStyle(.roundedBorder)`
|
|
408
|
-
|
|
409
|
-
**Font:** `.font(.footnote)` for provider settings fields
|
|
410
|
-
|
|
411
|
-
**Implementation:**
|
|
412
|
-
```swift
|
|
413
|
-
TextField("Placeholder", text: $binding)
|
|
414
|
-
.textFieldStyle(.roundedBorder)
|
|
415
|
-
.font(.footnote)
|
|
416
|
-
.padding(.horizontal, RunicSpacing.xs)
|
|
417
|
-
.padding(.vertical, RunicSpacing.xxs)
|
|
418
|
-
```
|
|
419
|
-
|
|
420
|
-
### Dividers
|
|
421
|
-
|
|
422
|
-
**Thickness:** 1pt (system standard)
|
|
423
|
-
|
|
424
|
-
**Color:** `Color(nsColor: .separatorColor)`
|
|
425
|
-
|
|
426
|
-
**Spacing:**
|
|
427
|
-
- Vertical padding: `RunicSpacing.xxs` (4pt) on both sides
|
|
428
|
-
- For preference dividers: `PreferencesDivider` component
|
|
429
|
-
|
|
430
|
-
**Implementation:**
|
|
431
|
-
```swift
|
|
432
|
-
Divider()
|
|
433
|
-
.padding(.vertical, RunicSpacing.xxs)
|
|
434
|
-
|
|
435
|
-
// Or use the component:
|
|
436
|
-
PreferencesDivider() // Includes standard padding
|
|
437
|
-
```
|
|
438
|
-
|
|
439
|
-
### Stepper Controls
|
|
440
|
-
|
|
441
|
-
**Layout:** Label on left, stepper control on right
|
|
442
|
-
|
|
443
|
-
**Stepper Component:**
|
|
444
|
-
- Minus button, value display, plus button
|
|
445
|
-
- Horizontal spacing: `RunicSpacing.xs` (8pt)
|
|
446
|
-
- Value label font: `.footnote.weight(.semibold)`
|
|
447
|
-
- Value background: `Color(nsColor: .controlBackgroundColor)`
|
|
448
|
-
- Corner radius: `6pt`
|
|
449
|
-
|
|
450
|
-
**Value Display Padding:**
|
|
451
|
-
- Horizontal: `RunicSpacing.sm` (12pt)
|
|
452
|
-
- Vertical: `RunicSpacing.xxs` (4pt)
|
|
453
|
-
|
|
454
|
-
**Implementation:**
|
|
455
|
-
```swift
|
|
456
|
-
PreferenceStepperRow(
|
|
457
|
-
title: "Setting Name",
|
|
458
|
-
subtitle: "Helper text",
|
|
459
|
-
step: 1,
|
|
460
|
-
range: 1...100,
|
|
461
|
-
valueLabel: { "\($0) units" },
|
|
462
|
-
value: $bindingValue
|
|
463
|
-
)
|
|
464
|
-
```
|
|
465
|
-
|
|
466
|
-
### Pickers (Segmented)
|
|
467
|
-
|
|
468
|
-
**Style:** `.pickerStyle(.segmented)`
|
|
469
|
-
|
|
470
|
-
**Frame:** Often constrained with `.frame(maxWidth: 300-400)` for neat alignment
|
|
471
|
-
|
|
472
|
-
**Font:** System default (body)
|
|
473
|
-
|
|
474
|
-
**Spacing:** Parent container handles spacing
|
|
475
|
-
|
|
476
|
-
**Implementation:**
|
|
477
|
-
```swift
|
|
478
|
-
VStack(alignment: .leading, spacing: RunicSpacing.xxs) {
|
|
479
|
-
Text("Picker Label")
|
|
480
|
-
.font(.body)
|
|
481
|
-
|
|
482
|
-
Picker("", selection: $binding) {
|
|
483
|
-
Text("Option 1").tag(Value.option1)
|
|
484
|
-
Text("Option 2").tag(Value.option2)
|
|
485
|
-
}
|
|
486
|
-
.pickerStyle(.segmented)
|
|
487
|
-
.frame(maxWidth: 300)
|
|
488
|
-
|
|
489
|
-
Text("Help text for picker")
|
|
490
|
-
.font(.footnote)
|
|
491
|
-
.foregroundStyle(.tertiary)
|
|
492
|
-
}
|
|
493
|
-
```
|
|
494
|
-
|
|
495
|
-
---
|
|
496
|
-
|
|
497
|
-
## Status Indicators
|
|
498
|
-
|
|
499
|
-
### Success States
|
|
500
|
-
|
|
501
|
-
**Color:** Green (`.systemGreen`, `.green`)
|
|
502
|
-
|
|
503
|
-
**Icons:** Checkmark symbols (`checkmark`, `checkmark.circle.fill`)
|
|
504
|
-
|
|
505
|
-
**Badges:**
|
|
506
|
-
```swift
|
|
507
|
-
Text("SUCCESS")
|
|
508
|
-
.font(.caption2.weight(.semibold))
|
|
509
|
-
.padding(.horizontal, RunicSpacing.xs)
|
|
510
|
-
.padding(.vertical, RunicSpacing.xxs)
|
|
511
|
-
.background(Color.green.opacity(0.2))
|
|
512
|
-
.foregroundStyle(.green)
|
|
513
|
-
.cornerRadius(4)
|
|
514
|
-
```
|
|
515
|
-
|
|
516
|
-
**Text Examples:**
|
|
517
|
-
- "Success: 200 OK"
|
|
518
|
-
- Green foreground for success messages
|
|
519
|
-
|
|
520
|
-
### Error States
|
|
521
|
-
|
|
522
|
-
**Color:** Red (`.systemRed`, `.red`, `MenuHighlightStyle.error()`)
|
|
523
|
-
|
|
524
|
-
**Icons:** Exclamation marks, warning symbols
|
|
525
|
-
|
|
526
|
-
**Text Style:**
|
|
527
|
-
```swift
|
|
528
|
-
Text(errorMessage)
|
|
529
|
-
.font(.footnote)
|
|
530
|
-
.foregroundStyle(MenuHighlightStyle.error(isHighlighted))
|
|
531
|
-
.lineLimit(4)
|
|
532
|
-
.fixedSize(horizontal: false, vertical: true)
|
|
533
|
-
```
|
|
534
|
-
|
|
535
|
-
**Badges:**
|
|
536
|
-
```swift
|
|
537
|
-
Text("CRITICAL")
|
|
538
|
-
.font(.caption2.weight(.semibold))
|
|
539
|
-
.padding(.horizontal, RunicSpacing.xs)
|
|
540
|
-
.padding(.vertical, RunicSpacing.xxs)
|
|
541
|
-
.background(Color.red.opacity(0.2))
|
|
542
|
-
.foregroundStyle(.red)
|
|
543
|
-
.cornerRadius(4)
|
|
544
|
-
```
|
|
545
|
-
|
|
546
|
-
### Warning States
|
|
547
|
-
|
|
548
|
-
**Color:** Orange (`.systemOrange`, `.orange`)
|
|
549
|
-
|
|
550
|
-
**Badges:**
|
|
551
|
-
```swift
|
|
552
|
-
Text("WARNING")
|
|
553
|
-
.font(.caption2.weight(.semibold))
|
|
554
|
-
.padding(.horizontal, RunicSpacing.xs)
|
|
555
|
-
.padding(.vertical, RunicSpacing.xxs)
|
|
556
|
-
.background(Color.orange.opacity(0.2))
|
|
557
|
-
.foregroundStyle(.orange)
|
|
558
|
-
.cornerRadius(4)
|
|
559
|
-
```
|
|
560
|
-
|
|
561
|
-
**Usage:** Threshold alerts, cautionary states
|
|
562
|
-
|
|
563
|
-
### Loading States
|
|
564
|
-
|
|
565
|
-
**Indicators:**
|
|
566
|
-
- `ProgressView().controlSize(.small)`
|
|
567
|
-
- Typically displayed inline with text
|
|
568
|
-
|
|
569
|
-
**Text:**
|
|
570
|
-
```swift
|
|
571
|
-
Text("Refreshing...")
|
|
572
|
-
.font(.footnote)
|
|
573
|
-
.foregroundStyle(.secondary)
|
|
574
|
-
|
|
575
|
-
// Or with animation
|
|
576
|
-
Text("Testing...")
|
|
577
|
-
.font(.footnote)
|
|
578
|
-
```
|
|
579
|
-
|
|
580
|
-
**Example:**
|
|
581
|
-
```swift
|
|
582
|
-
if isRefreshing {
|
|
583
|
-
HStack {
|
|
584
|
-
ProgressView().controlSize(.small)
|
|
585
|
-
Text("Refreshing...")
|
|
586
|
-
}
|
|
587
|
-
.font(.footnote)
|
|
588
|
-
.foregroundStyle(.secondary)
|
|
589
|
-
}
|
|
590
|
-
```
|
|
591
|
-
|
|
592
|
-
### Disabled States
|
|
593
|
-
|
|
594
|
-
**Opacity:** `0.5`
|
|
595
|
-
|
|
596
|
-
**Implementation:**
|
|
597
|
-
```swift
|
|
598
|
-
PreferenceToggleRow(...)
|
|
599
|
-
.disabled(!isEnabled)
|
|
600
|
-
.opacity(isEnabled ? 1 : 0.5)
|
|
601
|
-
```
|
|
602
|
-
|
|
603
|
-
**Color:** Text maintains normal colors but entire component is dimmed
|
|
604
|
-
|
|
605
|
-
**Interaction:** `.disabled(true)` prevents user interaction
|
|
606
|
-
|
|
607
|
-
---
|
|
608
|
-
|
|
609
|
-
## Best Practices
|
|
610
|
-
|
|
611
|
-
### Visual Hierarchy
|
|
612
|
-
|
|
613
|
-
1. **Use font weights strategically:**
|
|
614
|
-
- `.semibold` or `.medium` for headers that need emphasis
|
|
615
|
-
- Regular weight for body text
|
|
616
|
-
- Never over-emphasize multiple elements in the same area
|
|
617
|
-
|
|
618
|
-
2. **Leverage color hierarchy:**
|
|
619
|
-
- Primary text (default) for important content
|
|
620
|
-
- `.secondary` for supporting information
|
|
621
|
-
- `.tertiary` for least important text
|
|
622
|
-
- Avoid using more than 3 text colors in a single section
|
|
623
|
-
|
|
624
|
-
3. **Consistent spacing creates rhythm:**
|
|
625
|
-
- Use the spacing scale consistently
|
|
626
|
-
- Larger spacing between unrelated groups
|
|
627
|
-
- Smaller spacing within related items
|
|
628
|
-
|
|
629
|
-
4. **Size and proximity:**
|
|
630
|
-
- Group related settings with tighter spacing
|
|
631
|
-
- Separate distinct sections with dividers and increased spacing
|
|
632
|
-
- Use section headers to introduce new topics
|
|
633
|
-
|
|
634
|
-
### When to Use Cards vs. Plain Backgrounds
|
|
635
|
-
|
|
636
|
-
**Use Cards (with background color) when:**
|
|
637
|
-
- Items are interactive (clickable rows)
|
|
638
|
-
- Content needs visual grouping/separation
|
|
639
|
-
- Highlighting important information
|
|
640
|
-
- Creating distinct list items
|
|
641
|
-
|
|
642
|
-
**Examples:**
|
|
643
|
-
- Alert rule rows
|
|
644
|
-
- Provider toggle rows
|
|
645
|
-
- History entries
|
|
646
|
-
|
|
647
|
-
**Use Plain Backgrounds when:**
|
|
648
|
-
- Simple form layouts
|
|
649
|
-
- Standard preference panes with clear hierarchy
|
|
650
|
-
- Content flows naturally top to bottom
|
|
651
|
-
- Dividers provide sufficient separation
|
|
652
|
-
|
|
653
|
-
**Examples:**
|
|
654
|
-
- General settings pane
|
|
655
|
-
- Toggle lists with dividers
|
|
656
|
-
- Simple preference sections
|
|
657
|
-
|
|
658
|
-
### Grouping Related Settings
|
|
659
|
-
|
|
660
|
-
1. **Use SettingsSection for major groups:**
|
|
661
|
-
```swift
|
|
662
|
-
SettingsSection(contentSpacing: PreferencesLayoutMetrics.sectionSpacing) {
|
|
663
|
-
// Related settings
|
|
664
|
-
}
|
|
665
|
-
```
|
|
666
|
-
|
|
667
|
-
2. **Add section titles for clarity:**
|
|
668
|
-
```swift
|
|
669
|
-
Text("Section Name")
|
|
670
|
-
.font(.caption)
|
|
671
|
-
.foregroundStyle(.secondary)
|
|
672
|
-
.textCase(.uppercase)
|
|
673
|
-
```
|
|
674
|
-
|
|
675
|
-
3. **Separate with dividers:**
|
|
676
|
-
```swift
|
|
677
|
-
PreferencesDivider()
|
|
678
|
-
```
|
|
679
|
-
|
|
680
|
-
4. **Nest VStacks for sub-groupings:**
|
|
681
|
-
```swift
|
|
682
|
-
VStack(alignment: .leading, spacing: RunicSpacing.xs) {
|
|
683
|
-
// Tightly related items
|
|
684
|
-
}
|
|
685
|
-
```
|
|
686
|
-
|
|
687
|
-
### Error Message Formatting
|
|
688
|
-
|
|
689
|
-
**Display Patterns:**
|
|
690
|
-
1. **Inline errors** - Show directly below the affected control
|
|
691
|
-
2. **Expandable errors** - Preview with "Show details" button
|
|
692
|
-
3. **Copy-able errors** - Include copy button for technical details
|
|
693
|
-
|
|
694
|
-
**Typography:**
|
|
695
|
-
- Font: `.footnote`
|
|
696
|
-
- Color: `.systemRed` or `MenuHighlightStyle.error()`
|
|
697
|
-
- Line limit: `4` with `.fixedSize(horizontal: false, vertical: true)`
|
|
698
|
-
|
|
699
|
-
**Best practices:**
|
|
700
|
-
- Truncate long errors with preview/expand pattern
|
|
701
|
-
- Always provide copy functionality for debugging
|
|
702
|
-
- Use clear, actionable language when possible
|
|
703
|
-
- Include technical details in expandable sections
|
|
704
|
-
|
|
705
|
-
**Example:**
|
|
706
|
-
```swift
|
|
707
|
-
if let error = errorMessage {
|
|
708
|
-
VStack(alignment: .leading, spacing: RunicSpacing.xs) {
|
|
709
|
-
HStack {
|
|
710
|
-
Text("Error:")
|
|
711
|
-
.font(.footnote.weight(.semibold))
|
|
712
|
-
.foregroundStyle(.secondary)
|
|
713
|
-
Spacer()
|
|
714
|
-
Button { copyError() } label: {
|
|
715
|
-
Image(systemName: "doc.on.doc")
|
|
716
|
-
}
|
|
717
|
-
.buttonStyle(.plain)
|
|
718
|
-
}
|
|
719
|
-
|
|
720
|
-
Text(error)
|
|
721
|
-
.font(.footnote)
|
|
722
|
-
.foregroundStyle(.red)
|
|
723
|
-
.lineLimit(4)
|
|
724
|
-
.fixedSize(horizontal: false, vertical: true)
|
|
725
|
-
}
|
|
726
|
-
}
|
|
727
|
-
```
|
|
728
|
-
|
|
729
|
-
### Icon Usage Guidelines
|
|
730
|
-
|
|
731
|
-
**System Icons (SF Symbols):**
|
|
732
|
-
- Use semantic icons that clearly represent the action/content
|
|
733
|
-
- Consistent icon style throughout (prefer outline over fill for UI chrome)
|
|
734
|
-
- Standard size unless specific context requires adjustment
|
|
735
|
-
|
|
736
|
-
**Common Icon Patterns:**
|
|
737
|
-
- Gear: Settings/preferences
|
|
738
|
-
- Plus: Add new item
|
|
739
|
-
- Minus: Remove item
|
|
740
|
-
- Trash: Delete permanently
|
|
741
|
-
- Pencil: Edit
|
|
742
|
-
- Checkmark: Success/confirmation
|
|
743
|
-
- Exclamation: Warning/error
|
|
744
|
-
- Info circle: Information/help
|
|
745
|
-
- Doc on doc: Copy action
|
|
746
|
-
|
|
747
|
-
**Provider Icons:**
|
|
748
|
-
- Use `ProviderBrandIcon.image(for:size:)` for consistent provider branding
|
|
749
|
-
- Standard size: `32pt` in provider lists
|
|
750
|
-
- Fallback: `circle.dotted` system icon
|
|
751
|
-
|
|
752
|
-
**Accessibility:**
|
|
753
|
-
- Mark decorative icons as `.accessibilityHidden(true)`
|
|
754
|
-
- Provide accessibility labels for functional icons
|
|
755
|
-
- Ensure icon + text combinations are clear
|
|
756
|
-
|
|
757
|
-
---
|
|
758
|
-
|
|
759
|
-
## Layout Conventions
|
|
760
|
-
|
|
761
|
-
### Preferences Pane Structure
|
|
762
|
-
|
|
763
|
-
All preference panes follow this standard structure:
|
|
764
|
-
|
|
765
|
-
```swift
|
|
766
|
-
PreferencesPane {
|
|
767
|
-
SettingsSection(contentSpacing: PreferencesLayoutMetrics.sectionSpacing) {
|
|
768
|
-
Text("SECTION TITLE")
|
|
769
|
-
.font(.caption)
|
|
770
|
-
.foregroundStyle(.secondary)
|
|
771
|
-
.textCase(.uppercase)
|
|
772
|
-
|
|
773
|
-
// Section content
|
|
774
|
-
}
|
|
775
|
-
|
|
776
|
-
PreferencesDivider()
|
|
777
|
-
|
|
778
|
-
SettingsSection(...) {
|
|
779
|
-
// Next section
|
|
780
|
-
}
|
|
781
|
-
}
|
|
782
|
-
```
|
|
783
|
-
|
|
784
|
-
### Menu Card Structure
|
|
785
|
-
|
|
786
|
-
Menu cards use consistent internal spacing defined in `MenuCardMetrics`:
|
|
787
|
-
|
|
788
|
-
```swift
|
|
789
|
-
VStack(alignment: .leading, spacing: RunicSpacing.xxs) {
|
|
790
|
-
// Header section
|
|
791
|
-
|
|
792
|
-
Divider()
|
|
793
|
-
.padding(.vertical, RunicSpacing.xxs)
|
|
794
|
-
|
|
795
|
-
VStack(alignment: .leading, spacing: MenuCardMetrics.sectionSpacing) {
|
|
796
|
-
// Content sections
|
|
797
|
-
}
|
|
798
|
-
}
|
|
799
|
-
.padding(.horizontal, MenuCardMetrics.horizontalPadding)
|
|
800
|
-
.padding(.top, MenuCardMetrics.headerTopPadding)
|
|
801
|
-
.padding(.bottom, MenuCardMetrics.headerBottomPadding)
|
|
802
|
-
```
|
|
803
|
-
|
|
804
|
-
---
|
|
805
|
-
|
|
806
|
-
## Accessibility Considerations
|
|
807
|
-
|
|
808
|
-
1. **Dynamic Type:** All text uses SwiftUI's semantic font styles for automatic scaling
|
|
809
|
-
2. **Color Independence:** Never rely on color alone to convey meaning
|
|
810
|
-
3. **Touch Targets:** Ensure interactive elements meet minimum size requirements
|
|
811
|
-
4. **Contrast:** Use system colors for automatic high contrast support
|
|
812
|
-
5. **Labels:** Provide accessibility labels for icons and controls
|
|
813
|
-
6. **VoiceOver:** Test with VoiceOver to ensure logical navigation
|
|
814
|
-
|
|
815
|
-
---
|
|
816
|
-
|
|
817
|
-
## File References
|
|
818
|
-
|
|
819
|
-
Key implementation files:
|
|
820
|
-
- **Spacing:** `/Sources/Runic/Core/RunicSpacing.swift`
|
|
821
|
-
- **Components:** `/Sources/Runic/Views/Preferences/PreferencesComponents.swift`
|
|
822
|
-
- **Menu Styles:** `/Sources/Runic/Views/Menu/MenuHighlightStyle.swift`
|
|
823
|
-
- **Card Metrics:** `/Sources/Runic/Views/Menu/MenuCardView.swift`
|
|
824
|
-
|
|
825
|
-
---
|
|
826
|
-
|
|
827
|
-
## Version History
|
|
828
|
-
|
|
829
|
-
| Version | Date | Changes |
|
|
830
|
-
|---------|------|---------|
|
|
831
|
-
| 1.0 | January 31, 2026 | Initial design system documentation |
|
|
832
|
-
|
|
833
|
-
---
|
|
834
|
-
|
|
835
|
-
**Maintained by:** Runic Development Team
|
|
836
|
-
**Contact:** For questions or updates to this design system, refer to the project repository.
|