@@ -439,14 +439,13 @@ extension AgentProTab {
|
439 | 439 | func skillEditorControls(_ skill: SkillStatusEntryLite) -> some View { |
440 | 440 | ProCard(radius: AgentLayout.cardRadius) { |
441 | 441 | VStack(alignment: .leading, spacing: 12) { |
442 | | -Toggle( |
| 442 | +self.skillEditorToggleRow( |
443 | 443 | "Enabled globally", |
444 | | - isOn: Binding( |
445 | | - get: { skill.isGloballyEnabled }, |
446 | | - set: { enabled in |
447 | | -Task { await self.updateSkillGlobalEnabled(skill, enabled: enabled) } |
448 | | -})) |
449 | | -.disabled(self.isSkillConfigBusy(skill)) |
| 444 | + isOn: skill.isGloballyEnabled, |
| 445 | + disabled: self.isSkillConfigBusy(skill)) |
| 446 | +{ enabled in |
| 447 | +Task { await self.updateSkillGlobalEnabled(skill, enabled: enabled) } |
| 448 | +} |
450 | 449 | |
451 | 450 | if let primaryEnv = skill.primaryEnv, !primaryEnv.isEmpty { |
452 | 451 | VStack(alignment: .leading, spacing: 8) { |
@@ -480,6 +479,43 @@ extension AgentProTab {
|
480 | 479 | .padding(.horizontal, OpenClawProMetric.pagePadding) |
481 | 480 | } |
482 | 481 | |
| 482 | +func skillEditorToggleRow( |
| 483 | + _ title: String, |
| 484 | + isOn: Bool, |
| 485 | + disabled: Bool, |
| 486 | + onToggle: @escaping (Bool) -> Void) -> some View |
| 487 | +{ |
| 488 | + // Native Toggle rows in this sheet can ignore visible-row taps on iOS 26. |
| 489 | + // Keep the switch semantics explicit so the control always dispatches the mutation. |
| 490 | +Button { |
| 491 | +onToggle(!isOn) |
| 492 | +} label: { |
| 493 | +HStack { |
| 494 | +Text(title) |
| 495 | +Spacer(minLength: 8) |
| 496 | +self.skillEditorSwitchIndicator(isOn: isOn) |
| 497 | +} |
| 498 | +.contentShape(Rectangle()) |
| 499 | +} |
| 500 | +.buttonStyle(.plain) |
| 501 | +.disabled(disabled) |
| 502 | +.accessibilityLabel(title) |
| 503 | +.accessibilityValue(isOn ? "On" : "Off") |
| 504 | +} |
| 505 | + |
| 506 | +func skillEditorSwitchIndicator(isOn: Bool) -> some View { |
| 507 | +Capsule() |
| 508 | +.fill(isOn ? Color.accentColor : Color.secondary.opacity(0.35)) |
| 509 | +.frame(width: 52, height: 32) |
| 510 | +.overlay(alignment: isOn ? .trailing : .leading) { |
| 511 | +Circle() |
| 512 | +.fill(Color.white) |
| 513 | +.frame(width: 28, height: 28) |
| 514 | +.padding(2) |
| 515 | +.shadow(color: Color.black.opacity(0.14), radius: 1, x: 0, y: 1) |
| 516 | +} |
| 517 | +} |
| 518 | + |
483 | 519 | func skillEditorSetup(_ skill: SkillStatusEntryLite) -> some View { |
484 | 520 | ProCard(radius: AgentLayout.cardRadius) { |
485 | 521 | VStack(alignment: .leading, spacing: 10) { |
|