diff --git a/NucleicRemote/NucleicRemote/Views/Composer.swift b/NucleicRemote/NucleicRemote/Views/Composer.swift index 7aca549..e92f44c 100644 --- a/NucleicRemote/NucleicRemote/Views/Composer.swift +++ b/NucleicRemote/NucleicRemote/Views/Composer.swift @@ -40,7 +40,7 @@ struct StartChatComposer: View { TextField("Describe a task…", text: $draft, axis: .vertical) .textFieldStyle(.roundedBorder) .lineLimit(1...5) - .ultracodeGlow(active: MobileEfforts.isUltracode(effort)) + .orchestraGlow(active: MobileEfforts.isOrchestra(effort)) Button { if let project = selected { store.startChat(in: project.id, message: draft, effort: effort, auto: auto) diff --git a/NucleicRemote/NucleicRemote/Views/ProjectsView.swift b/NucleicRemote/NucleicRemote/Views/ProjectsView.swift index 781c1df..1200910 100644 --- a/NucleicRemote/NucleicRemote/Views/ProjectsView.swift +++ b/NucleicRemote/NucleicRemote/Views/ProjectsView.swift @@ -66,7 +66,7 @@ struct ProjectDetailView: View { HStack(alignment: .bottom, spacing: 8) { TextField("Start a chat in \(project.name)…", text: $draft, axis: .vertical) .textFieldStyle(.roundedBorder).lineLimit(1...4) - .ultracodeGlow(active: MobileEfforts.isUltracode(effort)) + .orchestraGlow(active: MobileEfforts.isOrchestra(effort)) Button { store.startChat(in: project.id, message: draft, effort: effort) draft = "" diff --git a/NucleicRemote/NucleicRemote/Views/Theme.swift b/NucleicRemote/NucleicRemote/Views/Theme.swift index 0c10bcb..dd433e5 100644 --- a/NucleicRemote/NucleicRemote/Views/Theme.swift +++ b/NucleicRemote/NucleicRemote/Views/Theme.swift @@ -13,10 +13,10 @@ enum Palette { static let paused = Color(red: 0.62, green: 0.49, blue: 0.93) // purple static let danger = Color(red: 0.92, green: 0.34, blue: 0.34) // red static let neutral = Color.secondary - /// The ultracode (orchestration mode) signature purple — mirrors the Mac's - /// `AppTheme.ultracode`. Used for the effort picker's Ultracode option and the + /// The orchestra (orchestration mode) signature purple — mirrors the Mac's + /// `AppTheme.orchestra`. Used for the effort picker's Orchestra option and the /// composer's purple ring. - static let ultracode = Color(red: 0.55, green: 0.28, blue: 0.95) + static let orchestra = Color(red: 0.55, green: 0.28, blue: 0.95) /// Dot/accent color for a session's status, refined by the last turn's disposition — a /// finished-the-work turn reads as "done" (success) rather than the calm "ready" accent. @@ -117,27 +117,27 @@ extension View { func card(padding: CGFloat = 14) -> some View { modifier(CardBackground(padding: padding)) } /// Apply the teal accent app-wide. func nucleicTint() -> some View { tint(Palette.accent) } - /// Wrap a composer field in the ultracode purple ring while `active` (mirrors the Mac's + /// Wrap a composer field in the orchestra purple ring while `active` (mirrors the Mac's /// animated composer glow, lighter touch). - func ultracodeGlow(active: Bool, cornerRadius: CGFloat = 8) -> some View { - modifier(UltracodeGlowModifier(active: active, cornerRadius: cornerRadius)) + func orchestraGlow(active: Bool, cornerRadius: CGFloat = 8) -> some View { + modifier(OrchestraGlowModifier(active: active, cornerRadius: cornerRadius)) } } /// The effort levels the remote offers, mirroring the Mac's `ModelCatalog.efforts` plus -/// ultracode. `ultracodeSentinel` MUST stay equal to the host's `OrchestrationMode.effortSentinel` +/// orchestra. `orchestraSentinel` MUST stay equal to the host's `OrchestrationMode.effortSentinel` /// — it's sent verbatim over the sync wire and resolved on the host (to `xhigh` + standing /// consent), so a mismatch would silently disable the mode. enum MobileEfforts { static let levels = ["low", "medium", "high", "xhigh", "max"] - static let ultracodeSentinel = "ultracode" + static let orchestraSentinel = "orchestra" static let fallback = "high" - static func isUltracode(_ effort: String) -> Bool { effort == ultracodeSentinel } - static func displayName(_ effort: String) -> String { isUltracode(effort) ? "Ultracode" : effort } + static func isOrchestra(_ effort: String) -> Bool { effort == orchestraSentinel } + static func displayName(_ effort: String) -> String { isOrchestra(effort) ? "Orchestra" : effort } } -/// A compact effort selector for the remote composers. Ultracode sits below the API levels, +/// A compact effort selector for the remote composers. Orchestra sits below the API levels, /// set apart with a sparkles glyph and the purple accent. struct EffortMenu: View { @Binding var effort: String @@ -150,23 +150,23 @@ struct EffortMenu: View { } } Divider() - Button { effort = MobileEfforts.ultracodeSentinel } label: { - Label("Ultracode", systemImage: MobileEfforts.isUltracode(effort) ? "checkmark" : "sparkles") + Button { effort = MobileEfforts.orchestraSentinel } label: { + Label("Orchestra", systemImage: MobileEfforts.isOrchestra(effort) ? "checkmark" : "sparkles") } } label: { HStack(spacing: 4) { - Image(systemName: MobileEfforts.isUltracode(effort) ? "sparkles" : "slider.horizontal.3") + Image(systemName: MobileEfforts.isOrchestra(effort) ? "sparkles" : "slider.horizontal.3") Text(MobileEfforts.displayName(effort)) } .font(.caption) - .foregroundStyle(MobileEfforts.isUltracode(effort) ? Palette.ultracode : Palette.accent) + .foregroundStyle(MobileEfforts.isOrchestra(effort) ? Palette.orchestra : Palette.accent) } } } -/// A gentle purple ring that breathes around a composer while ultracode is selected — the -/// remote echo of the Mac's `UltracodeGlow`. Honors Reduce Motion (holds steady). -struct UltracodeGlowModifier: ViewModifier { +/// A gentle purple ring that breathes around a composer while orchestra is selected — the +/// remote echo of the Mac's `OrchestraGlow`. Honors Reduce Motion (holds steady). +struct OrchestraGlowModifier: ViewModifier { var active: Bool var cornerRadius: CGFloat @Environment(\.accessibilityReduceMotion) private var reduceMotion @@ -178,9 +178,9 @@ struct UltracodeGlowModifier: ViewModifier { .overlay { if active { RoundedRectangle(cornerRadius: cornerRadius, style: .continuous) - .strokeBorder(Palette.ultracode.opacity(animating ? 0.9 : 0.5), + .strokeBorder(Palette.orchestra.opacity(animating ? 0.9 : 0.5), lineWidth: animating ? 1.6 : 1.2) - .shadow(color: Palette.ultracode.opacity(animating ? 0.5 : 0.2), + .shadow(color: Palette.orchestra.opacity(animating ? 0.5 : 0.2), radius: animating ? 8 : 3) .animation( reduceMotion ? .default